{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 7 reasons why I love Vaex for data science"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-02-14T10:51:04.004565Z",
     "start_time": "2020-02-14T10:51:03.030891Z"
    }
   },
   "outputs": [],
   "source": [
    "import vaex\n",
    "\n",
    "import numpy as np\n",
    "import pylab as plt\n",
    "\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Introduction\n",
    "\n",
    "[Vaex](https://github.com/vaexio/vaex) is an open-source DataFrame library for Python with an API that closely resembles that of [Pandas](https://pandas.pydata.org/docs/index.html). I have been using Vaex for several years in both academic and industry environments, and it is my go-to library for several of the data science projects I am working on. In this article I would like to share some of my favourite Vaex features. Some may be obvious by now, but some may surprise you.\n",
    "\n",
    "The following code examples are run on a MacBook Pro (15\", 2018, 2.6GHz Intel Core i7, 32GB RAM)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. Easy to work with very large datasets\n",
    "\n",
    "Nowadays, it becomes increasingly more common to encounter datasets that are larger than the available RAM on a typical laptop or a desktop workstation. [Vaex](https://github.com/vaexio/vaex) solves this problem rather elegantly by the use of memory mapping and lazy evaluations. As long as your data is stored in a memory mappable file format such as Apache Arrow or HDF5, Vaex will open it instantly, no matter how large it is, or how much RAM your machine has. In fact, the size of the files Vaex can read are only limited by the amount of free hard-disk space you have. If your data is not in a memory-mappable file format (e.g. CSV, JSON), you can easily convert it by using the rich Pandas I/O in combination with Vaex. [See this guide](https://docs.vaex.io/en/latest/faq.html#I-have-a-massive-CSV-file-which-I-can-not-fit-all-into-memory-at-one-time.-How-do-I-convert-it-to-HDF5?) on how to do so."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-02-14T10:51:04.842737Z",
     "start_time": "2020-02-14T10:51:04.718847Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-rw-r--r--  1 jovan  staff   107G Jul  3  2019 ../vaex-taxi/data/yellow_taxi_2009_2015_f32.hdf5\r\n"
     ]
    }
   ],
   "source": [
    "# Check the file size on disk\n",
    "!ls -l -h ../vaex-taxi/data/yellow_taxi_2009_2015_f32.hdf5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-02-14T10:51:05.825240Z",
     "start_time": "2020-02-14T10:51:05.765977Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table>\n",
       "<thead>\n",
       "<tr><th>#                                        </th><th>vendor_id  </th><th>pickup_datetime              </th><th>dropoff_datetime             </th><th>passenger_count  </th><th>payment_type  </th><th>trip_distance     </th><th>pickup_longitude  </th><th>pickup_latitude   </th><th>rate_code  </th><th>store_and_fwd_flag  </th><th>dropoff_longitude  </th><th>dropoff_latitude  </th><th>fare_amount       </th><th>surcharge  </th><th>mta_tax  </th><th>tip_amount        </th><th>tolls_amount  </th><th>total_amount      </th></tr>\n",
       "</thead>\n",
       "<tbody>\n",
       "<tr><td><i style='opacity: 0.6'>0</i>            </td><td>VTS        </td><td>2009-01-04 02:52:00.000000000</td><td>2009-01-04 03:02:00.000000000</td><td>1                </td><td>CASH          </td><td>2.630000114440918 </td><td>-73.99195861816406</td><td>40.72156524658203 </td><td>nan        </td><td>nan                 </td><td>-73.99380493164062 </td><td>40.6959228515625  </td><td>8.899999618530273 </td><td>0.5        </td><td>nan      </td><td>0.0               </td><td>0.0           </td><td>9.399999618530273 </td></tr>\n",
       "<tr><td><i style='opacity: 0.6'>1</i>            </td><td>VTS        </td><td>2009-01-04 03:31:00.000000000</td><td>2009-01-04 03:38:00.000000000</td><td>3                </td><td>Credit        </td><td>4.550000190734863 </td><td>-73.98210144042969</td><td>40.736289978027344</td><td>nan        </td><td>nan                 </td><td>-73.95584869384766 </td><td>40.768028259277344</td><td>12.100000381469727</td><td>0.5        </td><td>nan      </td><td>2.0               </td><td>0.0           </td><td>14.600000381469727</td></tr>\n",
       "<tr><td><i style='opacity: 0.6'>2</i>            </td><td>VTS        </td><td>2009-01-03 15:43:00.000000000</td><td>2009-01-03 15:57:00.000000000</td><td>5                </td><td>Credit        </td><td>10.350000381469727</td><td>-74.0025863647461 </td><td>40.73974609375    </td><td>nan        </td><td>nan                 </td><td>-73.86997985839844 </td><td>40.770225524902344</td><td>23.700000762939453</td><td>0.0        </td><td>nan      </td><td>4.739999771118164 </td><td>0.0           </td><td>28.440000534057617</td></tr>\n",
       "<tr><td><i style='opacity: 0.6'>3</i>            </td><td>DDS        </td><td>2009-01-01 20:52:58.000000000</td><td>2009-01-01 21:14:00.000000000</td><td>1                </td><td>CREDIT        </td><td>5.0               </td><td>-73.9742660522461 </td><td>40.79095458984375 </td><td>nan        </td><td>nan                 </td><td>-73.9965591430664  </td><td>40.731849670410156</td><td>14.899999618530273</td><td>0.5        </td><td>nan      </td><td>3.049999952316284 </td><td>0.0           </td><td>18.450000762939453</td></tr>\n",
       "<tr><td><i style='opacity: 0.6'>4</i>            </td><td>DDS        </td><td>2009-01-24 16:18:23.000000000</td><td>2009-01-24 16:24:56.000000000</td><td>1                </td><td>CASH          </td><td>0.4000000059604645</td><td>-74.00157928466797</td><td>40.719383239746094</td><td>nan        </td><td>nan                 </td><td>-74.00837707519531 </td><td>40.7203483581543  </td><td>3.700000047683716 </td><td>0.0        </td><td>nan      </td><td>0.0               </td><td>0.0           </td><td>3.700000047683716 </td></tr>\n",
       "<tr><td>...                                      </td><td>...        </td><td>...                          </td><td>...                          </td><td>...              </td><td>...           </td><td>...               </td><td>...               </td><td>...               </td><td>...        </td><td>...                 </td><td>...                </td><td>...               </td><td>...               </td><td>...        </td><td>...      </td><td>...               </td><td>...           </td><td>...               </td></tr>\n",
       "<tr><td><i style='opacity: 0.6'>1,173,057,922</i></td><td>VTS        </td><td>2015-12-31 23:59:56.000000000</td><td>2016-01-01 00:08:18.000000000</td><td>5                </td><td>1             </td><td>1.2000000476837158</td><td>-73.99381256103516</td><td>40.72087097167969 </td><td>1.0        </td><td>0.0                 </td><td>-73.98621368408203 </td><td>40.722469329833984</td><td>7.5               </td><td>0.5        </td><td>0.5      </td><td>1.7599999904632568</td><td>0.0           </td><td>10.5600004196167  </td></tr>\n",
       "<tr><td><i style='opacity: 0.6'>1,173,057,923</i></td><td>CMT        </td><td>2015-12-31 23:59:58.000000000</td><td>2016-01-01 00:05:19.000000000</td><td>2                </td><td>2             </td><td>2.0               </td><td>-73.96527099609375</td><td>40.76028060913086 </td><td>1.0        </td><td>0.0                 </td><td>-73.93951416015625 </td><td>40.75238800048828 </td><td>7.5               </td><td>0.5        </td><td>0.5      </td><td>0.0               </td><td>0.0           </td><td>8.800000190734863 </td></tr>\n",
       "<tr><td><i style='opacity: 0.6'>1,173,057,924</i></td><td>CMT        </td><td>2015-12-31 23:59:59.000000000</td><td>2016-01-01 00:12:55.000000000</td><td>2                </td><td>2             </td><td>3.799999952316284 </td><td>-73.98729705810547</td><td>40.739078521728516</td><td>1.0        </td><td>0.0                 </td><td>-73.9886703491211  </td><td>40.69329833984375 </td><td>13.5              </td><td>0.5        </td><td>0.5      </td><td>0.0               </td><td>0.0           </td><td>14.800000190734863</td></tr>\n",
       "<tr><td><i style='opacity: 0.6'>1,173,057,925</i></td><td>VTS        </td><td>2015-12-31 23:59:59.000000000</td><td>2016-01-01 00:10:26.000000000</td><td>1                </td><td>2             </td><td>1.9600000381469727</td><td>-73.99755859375   </td><td>40.72569274902344 </td><td>1.0        </td><td>0.0                 </td><td>-74.01712036132812 </td><td>40.705322265625   </td><td>8.5               </td><td>0.5        </td><td>0.5      </td><td>0.0               </td><td>0.0           </td><td>9.800000190734863 </td></tr>\n",
       "<tr><td><i style='opacity: 0.6'>1,173,057,926</i></td><td>VTS        </td><td>2015-12-31 23:59:59.000000000</td><td>2016-01-01 00:21:30.000000000</td><td>1                </td><td>1             </td><td>1.059999942779541 </td><td>-73.9843978881836 </td><td>40.76725769042969 </td><td>1.0        </td><td>0.0                 </td><td>-73.99098205566406 </td><td>40.76057052612305 </td><td>13.5              </td><td>0.5        </td><td>0.5      </td><td>2.9600000381469727</td><td>0.0           </td><td>17.760000228881836</td></tr>\n",
       "</tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "#              vendor_id    pickup_datetime                dropoff_datetime               passenger_count    payment_type    trip_distance       pickup_longitude    pickup_latitude     rate_code    store_and_fwd_flag    dropoff_longitude    dropoff_latitude    fare_amount         surcharge    mta_tax    tip_amount          tolls_amount    total_amount\n",
       "0              VTS          2009-01-04 02:52:00.000000000  2009-01-04 03:02:00.000000000  1                  CASH            2.630000114440918   -73.99195861816406  40.72156524658203   nan          nan                   -73.99380493164062   40.6959228515625    8.899999618530273   0.5          nan        0.0                 0.0             9.399999618530273\n",
       "1              VTS          2009-01-04 03:31:00.000000000  2009-01-04 03:38:00.000000000  3                  Credit          4.550000190734863   -73.98210144042969  40.736289978027344  nan          nan                   -73.95584869384766   40.768028259277344  12.100000381469727  0.5          nan        2.0                 0.0             14.600000381469727\n",
       "2              VTS          2009-01-03 15:43:00.000000000  2009-01-03 15:57:00.000000000  5                  Credit          10.350000381469727  -74.0025863647461   40.73974609375      nan          nan                   -73.86997985839844   40.770225524902344  23.700000762939453  0.0          nan        4.739999771118164   0.0             28.440000534057617\n",
       "3              DDS          2009-01-01 20:52:58.000000000  2009-01-01 21:14:00.000000000  1                  CREDIT          5.0                 -73.9742660522461   40.79095458984375   nan          nan                   -73.9965591430664    40.731849670410156  14.899999618530273  0.5          nan        3.049999952316284   0.0             18.450000762939453\n",
       "4              DDS          2009-01-24 16:18:23.000000000  2009-01-24 16:24:56.000000000  1                  CASH            0.4000000059604645  -74.00157928466797  40.719383239746094  nan          nan                   -74.00837707519531   40.7203483581543    3.700000047683716   0.0          nan        0.0                 0.0             3.700000047683716\n",
       "...            ...          ...                            ...                            ...                ...             ...                 ...                 ...                 ...          ...                   ...                  ...                 ...                 ...          ...        ...                 ...             ...\n",
       "1,173,057,922  VTS          2015-12-31 23:59:56.000000000  2016-01-01 00:08:18.000000000  5                  1               1.2000000476837158  -73.99381256103516  40.72087097167969   1.0          0.0                   -73.98621368408203   40.722469329833984  7.5                 0.5          0.5        1.7599999904632568  0.0             10.5600004196167\n",
       "1,173,057,923  CMT          2015-12-31 23:59:58.000000000  2016-01-01 00:05:19.000000000  2                  2               2.0                 -73.96527099609375  40.76028060913086   1.0          0.0                   -73.93951416015625   40.75238800048828   7.5                 0.5          0.5        0.0                 0.0             8.800000190734863\n",
       "1,173,057,924  CMT          2015-12-31 23:59:59.000000000  2016-01-01 00:12:55.000000000  2                  2               3.799999952316284   -73.98729705810547  40.739078521728516  1.0          0.0                   -73.9886703491211    40.69329833984375   13.5                0.5          0.5        0.0                 0.0             14.800000190734863\n",
       "1,173,057,925  VTS          2015-12-31 23:59:59.000000000  2016-01-01 00:10:26.000000000  1                  2               1.9600000381469727  -73.99755859375     40.72569274902344   1.0          0.0                   -74.01712036132812   40.705322265625     8.5                 0.5          0.5        0.0                 0.0             9.800000190734863\n",
       "1,173,057,926  VTS          2015-12-31 23:59:59.000000000  2016-01-01 00:21:30.000000000  1                  1               1.059999942779541   -73.9843978881836   40.76725769042969   1.0          0.0                   -73.99098205566406   40.76057052612305   13.5                0.5          0.5        2.9600000381469727  0.0             17.760000228881836"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# # Read data from S3\n",
    "# df = vaex.open('s3://vaex/taxi/yellow_taxi_2009_2015_f32.hdf5?anon=true')\n",
    "\n",
    "# Read data from local disk\n",
    "df = vaex.open('../vaex-taxi/data/yellow_taxi_2009_2015_f32.hdf5')\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Caption: Opening and previewing a 100GB file with Vaex is instant."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. No memory copies\n",
    "\n",
    "Vaex has a zero memory copy policy. This means that filtering a DataFrames costs very little memory and does not copy the data. Consider the following example."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-02-14T10:51:36.106131Z",
     "start_time": "2020-02-14T10:51:27.208332Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table>\n",
       "<thead>\n",
       "<tr><th>#                                        </th><th>vendor_id  </th><th>pickup_datetime              </th><th>dropoff_datetime             </th><th>passenger_count  </th><th>payment_type  </th><th>trip_distance     </th><th>pickup_longitude  </th><th>pickup_latitude   </th><th>rate_code  </th><th>store_and_fwd_flag  </th><th>dropoff_longitude  </th><th>dropoff_latitude  </th><th>fare_amount       </th><th>surcharge  </th><th>mta_tax  </th><th>tip_amount        </th><th>tolls_amount  </th><th>total_amount      </th></tr>\n",
       "</thead>\n",
       "<tbody>\n",
       "<tr><td><i style='opacity: 0.6'>0</i>            </td><td>VTS        </td><td>2009-01-04 02:52:00.000000000</td><td>2009-01-04 03:02:00.000000000</td><td>1                </td><td>CASH          </td><td>2.630000114440918 </td><td>-73.99195861816406</td><td>40.72156524658203 </td><td>nan        </td><td>nan                 </td><td>-73.99380493164062 </td><td>40.6959228515625  </td><td>8.899999618530273 </td><td>0.5        </td><td>nan      </td><td>0.0               </td><td>0.0           </td><td>9.399999618530273 </td></tr>\n",
       "<tr><td><i style='opacity: 0.6'>1</i>            </td><td>VTS        </td><td>2009-01-04 03:31:00.000000000</td><td>2009-01-04 03:38:00.000000000</td><td>3                </td><td>Credit        </td><td>4.550000190734863 </td><td>-73.98210144042969</td><td>40.736289978027344</td><td>nan        </td><td>nan                 </td><td>-73.95584869384766 </td><td>40.768028259277344</td><td>12.100000381469727</td><td>0.5        </td><td>nan      </td><td>2.0               </td><td>0.0           </td><td>14.600000381469727</td></tr>\n",
       "<tr><td><i style='opacity: 0.6'>2</i>            </td><td>DDS        </td><td>2009-01-01 20:52:58.000000000</td><td>2009-01-01 21:14:00.000000000</td><td>1                </td><td>CREDIT        </td><td>5.0               </td><td>-73.9742660522461 </td><td>40.79095458984375 </td><td>nan        </td><td>nan                 </td><td>-73.9965591430664  </td><td>40.731849670410156</td><td>14.899999618530273</td><td>0.5        </td><td>nan      </td><td>3.049999952316284 </td><td>0.0           </td><td>18.450000762939453</td></tr>\n",
       "<tr><td><i style='opacity: 0.6'>3</i>            </td><td>DDS        </td><td>2009-01-24 16:18:23.000000000</td><td>2009-01-24 16:24:56.000000000</td><td>1                </td><td>CASH          </td><td>0.4000000059604645</td><td>-74.00157928466797</td><td>40.719383239746094</td><td>nan        </td><td>nan                 </td><td>-74.00837707519531 </td><td>40.7203483581543  </td><td>3.700000047683716 </td><td>0.0        </td><td>nan      </td><td>0.0               </td><td>0.0           </td><td>3.700000047683716 </td></tr>\n",
       "<tr><td><i style='opacity: 0.6'>4</i>            </td><td>DDS        </td><td>2009-01-16 22:35:59.000000000</td><td>2009-01-16 22:43:35.000000000</td><td>2                </td><td>CASH          </td><td>1.2000000476837158</td><td>-73.98980712890625</td><td>40.73500442504883 </td><td>nan        </td><td>nan                 </td><td>-73.98502349853516 </td><td>40.72449493408203 </td><td>6.099999904632568 </td><td>0.5        </td><td>nan      </td><td>0.0               </td><td>0.0           </td><td>6.599999904632568 </td></tr>\n",
       "<tr><td>...                                      </td><td>...        </td><td>...                          </td><td>...                          </td><td>...              </td><td>...           </td><td>...               </td><td>...               </td><td>...               </td><td>...        </td><td>...                 </td><td>...                </td><td>...               </td><td>...               </td><td>...        </td><td>...      </td><td>...               </td><td>...           </td><td>...               </td></tr>\n",
       "<tr><td><i style='opacity: 0.6'>1,061,605,165</i></td><td>CMT        </td><td>2015-12-31 23:59:56.000000000</td><td>2016-01-01 00:09:25.000000000</td><td>1                </td><td>1             </td><td>1.0               </td><td>-73.9738998413086 </td><td>40.74289321899414 </td><td>1.0        </td><td>0.0                 </td><td>-73.98957061767578 </td><td>40.75054931640625 </td><td>8.0               </td><td>0.5        </td><td>0.5      </td><td>1.850000023841858 </td><td>0.0           </td><td>11.149999618530273</td></tr>\n",
       "<tr><td><i style='opacity: 0.6'>1,061,605,166</i></td><td>CMT        </td><td>2015-12-31 23:59:58.000000000</td><td>2016-01-01 00:05:19.000000000</td><td>2                </td><td>2             </td><td>2.0               </td><td>-73.96527099609375</td><td>40.76028060913086 </td><td>1.0        </td><td>0.0                 </td><td>-73.93951416015625 </td><td>40.75238800048828 </td><td>7.5               </td><td>0.5        </td><td>0.5      </td><td>0.0               </td><td>0.0           </td><td>8.800000190734863 </td></tr>\n",
       "<tr><td><i style='opacity: 0.6'>1,061,605,167</i></td><td>CMT        </td><td>2015-12-31 23:59:59.000000000</td><td>2016-01-01 00:12:55.000000000</td><td>2                </td><td>2             </td><td>3.799999952316284 </td><td>-73.98729705810547</td><td>40.739078521728516</td><td>1.0        </td><td>0.0                 </td><td>-73.9886703491211  </td><td>40.69329833984375 </td><td>13.5              </td><td>0.5        </td><td>0.5      </td><td>0.0               </td><td>0.0           </td><td>14.800000190734863</td></tr>\n",
       "<tr><td><i style='opacity: 0.6'>1,061,605,168</i></td><td>VTS        </td><td>2015-12-31 23:59:59.000000000</td><td>2016-01-01 00:10:26.000000000</td><td>1                </td><td>2             </td><td>1.9600000381469727</td><td>-73.99755859375   </td><td>40.72569274902344 </td><td>1.0        </td><td>0.0                 </td><td>-74.01712036132812 </td><td>40.705322265625   </td><td>8.5               </td><td>0.5        </td><td>0.5      </td><td>0.0               </td><td>0.0           </td><td>9.800000190734863 </td></tr>\n",
       "<tr><td><i style='opacity: 0.6'>1,061,605,169</i></td><td>VTS        </td><td>2015-12-31 23:59:59.000000000</td><td>2016-01-01 00:21:30.000000000</td><td>1                </td><td>1             </td><td>1.059999942779541 </td><td>-73.9843978881836 </td><td>40.76725769042969 </td><td>1.0        </td><td>0.0                 </td><td>-73.99098205566406 </td><td>40.76057052612305 </td><td>13.5              </td><td>0.5        </td><td>0.5      </td><td>2.9600000381469727</td><td>0.0           </td><td>17.760000228881836</td></tr>\n",
       "</tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "#              vendor_id    pickup_datetime                dropoff_datetime               passenger_count    payment_type    trip_distance       pickup_longitude    pickup_latitude     rate_code    store_and_fwd_flag    dropoff_longitude    dropoff_latitude    fare_amount         surcharge    mta_tax    tip_amount          tolls_amount    total_amount\n",
       "0              VTS          2009-01-04 02:52:00.000000000  2009-01-04 03:02:00.000000000  1                  CASH            2.630000114440918   -73.99195861816406  40.72156524658203   nan          nan                   -73.99380493164062   40.6959228515625    8.899999618530273   0.5          nan        0.0                 0.0             9.399999618530273\n",
       "1              VTS          2009-01-04 03:31:00.000000000  2009-01-04 03:38:00.000000000  3                  Credit          4.550000190734863   -73.98210144042969  40.736289978027344  nan          nan                   -73.95584869384766   40.768028259277344  12.100000381469727  0.5          nan        2.0                 0.0             14.600000381469727\n",
       "2              DDS          2009-01-01 20:52:58.000000000  2009-01-01 21:14:00.000000000  1                  CREDIT          5.0                 -73.9742660522461   40.79095458984375   nan          nan                   -73.9965591430664    40.731849670410156  14.899999618530273  0.5          nan        3.049999952316284   0.0             18.450000762939453\n",
       "3              DDS          2009-01-24 16:18:23.000000000  2009-01-24 16:24:56.000000000  1                  CASH            0.4000000059604645  -74.00157928466797  40.719383239746094  nan          nan                   -74.00837707519531   40.7203483581543    3.700000047683716   0.0          nan        0.0                 0.0             3.700000047683716\n",
       "4              DDS          2009-01-16 22:35:59.000000000  2009-01-16 22:43:35.000000000  2                  CASH            1.2000000476837158  -73.98980712890625  40.73500442504883   nan          nan                   -73.98502349853516   40.72449493408203   6.099999904632568   0.5          nan        0.0                 0.0             6.599999904632568\n",
       "...            ...          ...                            ...                            ...                ...             ...                 ...                 ...                 ...          ...                   ...                  ...                 ...                 ...          ...        ...                 ...             ...\n",
       "1,061,605,165  CMT          2015-12-31 23:59:56.000000000  2016-01-01 00:09:25.000000000  1                  1               1.0                 -73.9738998413086   40.74289321899414   1.0          0.0                   -73.98957061767578   40.75054931640625   8.0                 0.5          0.5        1.850000023841858   0.0             11.149999618530273\n",
       "1,061,605,166  CMT          2015-12-31 23:59:58.000000000  2016-01-01 00:05:19.000000000  2                  2               2.0                 -73.96527099609375  40.76028060913086   1.0          0.0                   -73.93951416015625   40.75238800048828   7.5                 0.5          0.5        0.0                 0.0             8.800000190734863\n",
       "1,061,605,167  CMT          2015-12-31 23:59:59.000000000  2016-01-01 00:12:55.000000000  2                  2               3.799999952316284   -73.98729705810547  40.739078521728516  1.0          0.0                   -73.9886703491211    40.69329833984375   13.5                0.5          0.5        0.0                 0.0             14.800000190734863\n",
       "1,061,605,168  VTS          2015-12-31 23:59:59.000000000  2016-01-01 00:10:26.000000000  1                  2               1.9600000381469727  -73.99755859375     40.72569274902344   1.0          0.0                   -74.01712036132812   40.705322265625     8.5                 0.5          0.5        0.0                 0.0             9.800000190734863\n",
       "1,061,605,169  VTS          2015-12-31 23:59:59.000000000  2016-01-01 00:21:30.000000000  1                  1               1.059999942779541   -73.9843978881836   40.76725769042969   1.0          0.0                   -73.99098205566406   40.76057052612305   13.5                0.5          0.5        2.9600000381469727  0.0             17.760000228881836"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_filtered = df[(df.passenger_count>0) & (df.passenger_count<5)]\n",
    "df_filtered"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Caption: Filtering a Vaex DataFrame does not copy the data and takes negligible amount of memory."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The creation of the `df_filtered` DataFrame takes no extra memory! This is because `df_filtered` is a _shallow_ copy of `df`. When creating filtered DataFrames, Vaex creates a binary mask which is then applied to the original data, without the need to make copies. The memory costs for these kind of filters are low: one needs ~1.2 GB of RAM to filter a 1 billion row DataFrame. This is negligible compared to other \"classical\" tools where one would need 100GB to simply read in the data, and another ~100GB for the filtered DataFrame."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. Virtual columns"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Transforming existing columns of a Vaex DataFrame into new ones results in the creation of _virtual columns_. Virtual columns behave just like normal ones, but they take up no memory what so ever. This is because Vaex only remembers the _expression_ the defines them, and does not calculate the values up front. These columns are lazily evaluated only when necessary, keeping memory usage low."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-02-14T10:51:44.105206Z",
     "start_time": "2020-02-14T10:51:44.094212Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table>\n",
       "<thead>\n",
       "<tr><th>#                            </th><th style=\"text-align: right;\">  fare_amount</th><th style=\"text-align: right;\">  total_amount</th><th style=\"text-align: right;\">  tip_amount</th><th style=\"text-align: right;\">  tip_percentage</th></tr>\n",
       "</thead>\n",
       "<tbody>\n",
       "<tr><td><i style='opacity: 0.6'>0</i></td><td style=\"text-align: right;\">          8.9</td><td style=\"text-align: right;\">          9.4 </td><td style=\"text-align: right;\">        0   </td><td style=\"text-align: right;\">          0     </td></tr>\n",
       "<tr><td><i style='opacity: 0.6'>1</i></td><td style=\"text-align: right;\">         12.1</td><td style=\"text-align: right;\">         14.6 </td><td style=\"text-align: right;\">        2   </td><td style=\"text-align: right;\">         13.6986</td></tr>\n",
       "<tr><td><i style='opacity: 0.6'>2</i></td><td style=\"text-align: right;\">         23.7</td><td style=\"text-align: right;\">         28.44</td><td style=\"text-align: right;\">        4.74</td><td style=\"text-align: right;\">         16.6667</td></tr>\n",
       "<tr><td><i style='opacity: 0.6'>3</i></td><td style=\"text-align: right;\">         14.9</td><td style=\"text-align: right;\">         18.45</td><td style=\"text-align: right;\">        3.05</td><td style=\"text-align: right;\">         16.5312</td></tr>\n",
       "<tr><td><i style='opacity: 0.6'>4</i></td><td style=\"text-align: right;\">          3.7</td><td style=\"text-align: right;\">          3.7 </td><td style=\"text-align: right;\">        0   </td><td style=\"text-align: right;\">          0     </td></tr>\n",
       "</tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "  #    fare_amount    total_amount    tip_amount    tip_percentage\n",
       "  0            8.9            9.4           0               0\n",
       "  1           12.1           14.6           2              13.6986\n",
       "  2           23.7           28.44          4.74           16.6667\n",
       "  3           14.9           18.45          3.05           16.5312\n",
       "  4            3.7            3.7           0               0"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['tip_percentage'] = df.tip_amount / df.total_amount * 100\n",
    "df[['fare_amount', 'total_amount', 'tip_amount', 'tip_percentage']].head(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Caption: The \"tip_percentage\" column is a virtual column: it take no extra memory and is lazily  evaluated on the fly when needed."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. Performance"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Vaex is _fast_. I mean _seriously fast_. The evaluation of virtual columns is fully parallelized and done with one pass over the data. Column methods such as \"value_counts\", \"groupby\" , \"unique\" and the various string operations are  using fast and efficient algoithms, implemented in C++ under the hood. All of them work in an out-of-core fashion, meaning you can process much more data than you fit into RAM, and use all available cores of your processor. For example, doing a \"value_counts\" operation takes only a second for over 1 billion rows!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-02-14T10:51:52.994399Z",
     "start_time": "2020-02-14T10:51:52.273518Z"
    }
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "b1e0f515814a47ffb0d9027c34a70ffd",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(FloatProgress(value=0.0, max=1.0), Label(value='In progress...')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "1     812321234\n",
       "2     172864560\n",
       "5      81923912\n",
       "3      51435890\n",
       "6      25614703\n",
       "        ...    \n",
       "69            1\n",
       "66            1\n",
       "61            1\n",
       "53            1\n",
       "70            1\n",
       "Length: 62, dtype: int64"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.passenger_count.value_counts(progress='widget')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Caption: Using Vaex, the \"value_counts\" operation takes ~1s for over _1.1 billion rows!_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. Just-In-Time Compilation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. No memory copies\n",
    "\n",
    "Vaex has a zero memory copy policy. This means that filtering DataFrame costs very little memory and does not copy the data. Consider the following example."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As long as a virtual column is defined only using [Numpy](https://numpy.org/) or pure Python operations, Vaex can accelerate its evaluation by jitting, or Just-In-Time compilation via [Numba](http://numba.pydata.org/) or [Pythran](https://pythran.readthedocs.io/en/latest/). Vaex also supports acceleration via [CUDA](https://developer.nvidia.com/cuda-zone) if your machine has a CUDA enabled NVIDIA graphics card. This can be quite useful for speeding up the evaluation of rather computationally expensive virtual columns. \n",
    "\n",
    "Consider the example below. I have defined the arc distance between two geographical locations, a calculation that involves quite some algebra and trigonometry. Calculating the mean value will force the execution of this rather computationally expensive virtual column. When the execution is done purely with Numpy, it takes only 30 seconds, which I find impressive given that it is done for over **1.1 billion rows**. Now, when we do the same with the numba pre-compiled expression, we get ~2.5 times faster execution time, at least on my laptop. Unfortunately, I do not have an NVIDIA graphics card so I can not do the same using CUDA at this time. If you do, I'll be very happy if you could try this out and share the results.\n",
    "\n",
    "A small but important bonus: Notice how you do not need to call `.compute` or any such method - Vaex automatically knows when to be lazy and when execute a computation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-02-14T10:52:44.836057Z",
     "start_time": "2020-02-14T10:52:02.107778Z"
    }
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "b2c9bc4c513c4b42a76a5dd90bd4df87",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(FloatProgress(value=0.0, max=1.0), Label(value='In progress...')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "b9531b2b9fe2425489acf4bd0b296c63",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(FloatProgress(value=0.0, max=1.0), Label(value='In progress...')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Mean arc distance comuted with numpy: 12.70720\n",
      "Mean arc distance comuted with numba: 12.70720\n"
     ]
    }
   ],
   "source": [
    "def arc_distance(theta_1, phi_1, theta_2, phi_2):\n",
    "    temp = (np.sin((theta_2-theta_1)/2*np.pi/180)**2\n",
    "           + np.cos(theta_1*np.pi/180)*np.cos(theta_2*np.pi/180) * np.sin((phi_2-phi_1)/2*np.pi/180)**2)\n",
    "    distance = 2 * np.arctan2(np.sqrt(temp), np.sqrt(1-temp))\n",
    "    return distance * 3958.8\n",
    "\n",
    "# Expression to be evaluated with numpy as usual\n",
    "df['arc_distance_numpy'] = arc_distance(df.pickup_longitude, \n",
    "                                        df.pickup_latitude, \n",
    "                                        df.dropoff_longitude, \n",
    "                                        df.dropoff_latitude)\n",
    "\n",
    "# Expression to be pre-compiled with numba, and then executed\n",
    "df['arc_distance_numba'] = arc_distance(df.pickup_longitude, \n",
    "                                        df.pickup_latitude, \n",
    "                                        df.dropoff_longitude, \n",
    "                                        df.dropoff_latitude).jit_numba()\n",
    "\n",
    "# Expression to be pre-compiled with CUDA, and then executed on you GPU \n",
    "# provided you have a CUDA compatible NVIDIA GPU.\n",
    "# df['arc_distance_cuda'] = arc_distance(df.pickup_longitude, \n",
    "#                                        df.pickup_latitude, \n",
    "#                                        df.dropoff_longitude, \n",
    "#                                        df.dropoff_latitude).jit_cuda()\n",
    "\n",
    "# Calculate the mean \n",
    "mean_numpy = df.arc_distance_numpy.mean(progress='widget')\n",
    "mean_numba = df.arc_distance_numba.mean(progress='widget')\n",
    "print(f'Mean arc distance comuted with numpy: {mean_numpy:.5f}')\n",
    "print(f'Mean arc distance comuted with numba: {mean_numba:.5f}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Caption: Jitting can lead to ~2.5 time faster execution times for a computationally expensive virtual column."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6. Selections\n",
    "\n",
    "Vaex implements a concept called _selections_ which is used to, ah, select the data. This is useful when you want to explore the data by, for example, calculating statistics on different portions of it without making a new reference DataFrame each time. The true power of using selections is that we can calculate a statistic for multiple selections with just one pass over the data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-02-14T10:53:35.752782Z",
     "start_time": "2020-02-14T10:53:28.969348Z"
    }
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "8ceafb99faa04685ab3607dbce998e4c",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(FloatProgress(value=0.0, max=1.0), Label(value='In progress...')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "array([11.21730816, 11.2078196 , 11.26832503])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "select_n_passengers_lt3 = df.passenger_count < 3\n",
    "select_n_passengers_ge3 = df.passenger_count >= 3\n",
    "\n",
    "df.fare_amount.mean(selection=[None, select_n_passengers_lt3, select_n_passengers_ge3], progress='widget')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Caption: You can calculate statistics for multiple selections with one pass over the data."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This can be be also useful for making various visualisations. For example, we can use the `.count` method to create a couple of histograms on different selections with just one pass over the data. Quite efficient!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-02-14T10:53:46.734642Z",
     "start_time": "2020-02-14T10:53:40.557183Z"
    }
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "f421ff08b7c64c7da1b7d7cba2c48ee4",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(FloatProgress(value=0.0, max=1.0), Label(value='In progress...')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAewAAAEVCAYAAAAit9axAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3deXzU1bnH8c9DIGwJCGWRHVnCIhKWqIDKVjRYWritxovClShiKaggLWUTFEpECyKiXqpWEVmEaqW1gIioiK0GDRQtssseROAqKois5/4xkzGBmckkzEwy5Pt+vfLKzG87z/yUPHOW3znmnENERESKt1JFHYCIiIjkTwlbREQkBihhi4iIxAAlbBERkRighC0iIhIDlLBFRERiQLFP2Gb2gpkdNLMNIRz7uJmt9/5sNbMj0YhRREQk0qy4P4dtZp2Bo8BLzrlWBTjvXqCtc+7OiAUnIiISJcW+hu2cWw18lXubmTU2s+VmttbM3jez5n5OvRV4OSpBioiIRFjpog6gkJ4FBjvntpnZ1cD/At1zdppZA+Ay4J0iik9ERCSsYi5hm1kC0Al4xcxyNpc957C+wKvOuTPRjE1ERCRSYi5h42nGP+KcaxPkmL7A0CjFIyIiEnHFvg/7XM65b4GdZpYGYB7JOfvNrBlQBfiwiEIUEREJu2KfsM3sZTzJt5mZ7TOzgUA/YKCZfQJ8BvTJdcqtwEJX3Ie/i4iIFECxf6xLREREYqCGLSIiIsV80Fm1atVcw4YNizoMERGRqFi7du1h51x1f/uKdcJu2LAhWVlZRR2GiIhIVJjZ7kD71CQuIiISA5SwRUREYoAStoiISAxQwhYREYkBStgiIiIxoFiPEheR2PHtt99y8OBBTp06VdShiBRLZcqUoUaNGlSqVKlQ5ythi8gF+/bbb/nyyy+pU6cO5cuXJ9dKeiICOOc4fvw42dnZAIVK2iU+YT+3egczVm7l2En/K3FWjI9jeI8kBnVuFOXIRGLHwYMHqVOnDhUqVCjqUESKJTOjQoUK1KlTh/379xcqYZf4PuxgyRrg2MkzzFi5NYoRicSeU6dOUb58+aIOQ6TYK1++fKG7jUp8wg6WrAtyjEhJp2ZwkfxdyL+TEt8kntuuR3rled9w9NIiikRERCSvEl/DFhERiQVK2CIiIjFACVtERCSAV155hZSUFC655BIqVqxImzZtmDNnTpHEoj5sEREp9k6fPk1cXFzYBzceOnSIxMREypUr53f/T37yEx544AGaN29OmTJlWLJkCQMHDqR69er87Gc/C2ss+VENW0RKrK5duzJkyBDGjh1LtWrVqFGjBr/73e84e/as75iGDRsybdq0886755578hwzadIk0tPTSUxMpF69eixatIgjR47Qt29fEhISaNq0KStWrMg3nsGDBzNs2DCqVKlClSpVGDlyZJ545s2bx5VXXkliYiI1atQgLS3NNxkHeB6xu++++6hduzZly5alXr16jB492rf/tddeo3Xr1pQvX56qVavSpUsXvvzyS9/+f/zjH7Rv355y5cpx2WWXMW7cOE6ePJnns06ePJlf//rXVKpUibp16zJ16tQ8n2Pr1q106dKFcuXK0axZM5YtW0ZCQgIvvvii75js7Gz69u3r+5y9evVi27Ztvv0PPfQQrVq14sUXX6Rx48aULVuWY8eOsXr1ajp06EBCQgKVK1fm6quvZsOGDUHv67lOnjzJX//6V/r06UPt2rXzfP5zde/enf/6r/+iefPmNG7cmGHDhtG6dWvef//9ApUZDlGrYZtZM2BRrk2NgAnOuRnRikFEoqcon7I494mPYObPn8+wYcP44IMPWL9+Pbfddhvt27fn1ltvLVCZM2bMYPLkyYwbN44//elPDBgwgO7du9O3b18mT57MlClT6N+/P3v27AlYm8uJJz09nQ8//JBPP/2UQYMGUatWLUaMGAF4ks3EiRNp3rw5hw8fZtSoUdx6662sXr0agJkzZ7J48WIWLlxIw4YN2bdvH1u2bAHgwIED9O3blylTpnDTTTdx9OhRMjMzfWW/+eab9OvXjyeeeILOnTuzZ88eBg8ezIkTJ/J8aXn88ceZOHEiI0eO5I033uC+++7j2muvpWPHjpw9e5Zf/vKXXHrppWRmZnL8+HGGDx/OiRMnfOd///33dOvWjU6dOvHee+8RHx/PtGnT6NGjB5s2bfJNwLNz504WLFjAK6+8Qnx8POXKlaNPnz4MHDiQ+fPnc+rUKdatW0dcXFxI/43WrFnDnDlzWLRoEWXKlOHWW29lzZo1NGjQIKTznXO88847bNmyhYyMjJDOCaeoJWzn3BagDYCZxQHZwOJolS8i4k/Lli2ZNGkSAElJSTz33HO8/fbbBU7YqampDBkyBICJEycyffp0mjRpwu233w7A+PHjeeGFF9iwYQMpKSkBr1OrVi1mzpyJmdG8eXO2bt3K9OnTfQn7zjvv9B3bqFEjZs2aRYsWLdi3bx9169Zl9+7dJCUlcd1112Fm1K9fn06dOgGwf/9+Tp06xc033+xLUq1atfJdLyMjg5EjR3LHHXcA0LhxYx599FH69+/P1KlTfc3RN9xwg6+F4d5772XmzJm8/fbbdOzYkbfeeostW7awYsUK6tSpA3gS/DXXXOMrZ+HChTjnmD17tu+azzzzDDVq1GDJkiXccsstgOfLydy5c6lZsyYAX331FUeOHOEXv/gFjRs3BqB58+ZB/7vs27ePl156iZdeeok9e/bQp08f5s6dS2pqasiJ/ptvvqFOnTqcOHGCuLg4nn76aW688caQzg2nomoS/ynwuXNudxGVLyICQOvWrfO8r127NgcPHryg6yQkJFChQgWuuOIK37acpJPftTt06JCnn7Zjx45kZ2fz7bffArBu3Tr69OlDgwYNSExM9CX/PXv2AJCens769etJSkpi6NChLF261NeknpycTI8ePWjVqhU33XQTs2bN4tChQ76y1q5dS0ZGBgkJCb6f2267jWPHjnHgwAG/nxXy3rPNmzdTu3ZtX7IGuPLKKylV6sd0s3btWnbu3EliYqKvnMqVK/P111/z+eef+46rW7eu774BVK1alfT0dFJTU+nVqxfTp09n7969Qe/nAw88wLhx42jWrBl79uzh5Zdf5mc/+1nIyRogMTGR9evX8/HHH5ORkcGIESN4++23Qz4/XIpq0Flf4OUiKltEoqAgzdJFqUyZMnnem1mePuNSpUrhnMtzjL+pJf1dJ/e2nCSc+9oFdezYMVJTU+nRowdz586lRo0aHD58mOuuu87Xz9yuXTt27drF8uXLeeeddxgwYADJycm89dZbxMXFsWLFCjIzM1mxYgXPP/88Y8aM4b333iM5OZmzZ8/y4IMPkpaWdl7Z1atXD/pZcz6Xcy7fgWFnz56lTZs2LFy48Lx9VatW9b2uWLHieftnz57N8OHDWb58Oa+//jrjxo3jb3/7G6mpqX7LeuCBB6hVqxbz5s2jWbNm3HLLLfTv3z9PjT8/pUqVokmTJgC0adOGTZs28fDDD/PTn/405GuEQ9Rr2GYWD/QGXgmw/24zyzKzrNzf/EREikL16tX54osvfO9/+OEHNm/eHLHy1qxZk+cLQmZmJrVr16ZSpUps3ryZw4cP8/DDD9O5c2eaN2/ut8aemJhIWloas2bNYunSpbzzzjts374d8CTXjh078uCDD/Lxxx9Tu3ZtFi3yDC9q164dmzdvpkmTJuf9lC4dWv2uRYsWZGdns3//ft+2rKysPF9U2rVrx/bt26lWrdp55eRO2IEkJyczatQoVq1aRdeuXYM+ZtWkSROmTJnC7t27WbRoEUePHiU1NZXGjRszYcIEtm4t+FoRZ8+ezdMnHy1F0SR+I7DOOed3WJ5z7lnnXIpzLiX3NzoRkaLQvXt35s+fz6pVq/jss8+48847I7rm9/79+xk+fDhbtmzh1VdfZerUqdx///0A1K9fn7Jly/LUU0+xY8cOli5dyvjx4/OcP336dF5++WU2bdrE9u3bWbBggW80d2ZmJpMnT+bjjz9mz549vP766+zdu5eWLVsCMGHCBBYsWMCECRPYsGEDmzdv5tVXX+X3v/99yPFff/31NGvWjAEDBvDJJ5+QmZnJiBEjKF26tK/m3a9fP2rWrEmfPn1477332LlzJ6tXr+a3v/1tnpHi59q5cyejR4/mgw8+YPfu3bz77rt8+umnvviDKVWqlK9l4sCBA4wfP55//vOftGjRwted4E9GRgYrV65kx44dbNq0iccee4y5c+fSv3//kO9JuBRFk/itqDlcRGLEmDFj2LVrF3369CEhIYFx48blqT2GW79+/Thz5gxXX301ZsbAgQN9Cbt69erMmTOHsWPH8vTTT9O6dWumT59Oz549fecnJiYydepUtm3bhpnRtm1b3njjDSpUqEDlypX517/+xZNPPsmRI0eoV68e48eP9yWf1NRUli5dyh/+8AemTZtG6dKlSUpKIj09PeT4S5UqxeLFi7nrrru46qqraNiwIY899hi/+tWvfKPjK1SowOrVqxk9ejRpaWl888031K5dm27dulGlSpWA165QoQJbt24lLS2Nw4cPU7NmTfr168eoUaMKdI8TEhJIT08nPT2d3bt3U61atYDHHj16lN/85jfs27eP8uXL07x5c1566aUCD0oMBzu3byaihZlVAPYCjZxz3+R3fEpKisvKyopoTLkfPQm2+Ees9MeJFIVNmzbRokWLog4j5nXt2pVWrVrx1FNPFXUoYfXJJ5/Qpk0bsrKyaN++fVGHU+SC/Xsxs7XOOb+PEUS1hu2c+x74STTLjITnVu8Iuo52xfg4hvdIYlDnRlGOTESk6C1evJiKFSvStGlTdu3axYgRI0hOTqZdu3ZFHVpM00xnhRAsWYNn/ewZKws+kEFE5GLw3Xffcc8999CyZUv69etHixYtePPNN7Vm+gXSXOKFECxZF+QYEZHcVq1aVdQhhMXtt9/umzBGwkcJ+wIF6/cWEREJFzWJi4iIxAAlbBERkRighC0iIhID1IcdIvVNi4hIUVINO4iK8cFXc8lvv4iISLgoYQcxvEdSwKScMzmKiIhINKhJPIhBnRtptjIREfFr48aNDB06lI0bN/rmQ+/bty8PPfQQ8fHxYS9PCVtERIq906dPExcXV+DZ0vbt20edOnUiMstafHw8AwYMoG3btlxyySV88sknDBo0iNOnT/PHP/4x7OWpSVxESqyuXbsyZMgQxo4dS7Vq1ahRowa/+93v8qzd3LBhQ6ZNm3beeffcc0+eYyZNmkR6ejqJiYnUq1ePRYsWceTIEfr27UtCQgJNmzZlxYoV+cYzePBghg0bRpUqVahSpQojR47ME8+8efO48sorSUxMpEaNGqSlpZGdne3bf+rUKe677z5q165N2bJlqVevHqNHj/btf+2112jdujXly5enatWqdOnShS+//HG143/84x+0b9+ecuXKcdlllzFu3DhOnjyZ57NOnjyZX//6175lO6dOnZrnc2zdupUuXbpQrlw5mjVrxrJly0hISODFF1/0HZOdnU3fvn19n7NXr155ltZ86KGHaNWqFS+++CKNGzembNmyHDt2jNWrV9OhQwcSEhKoXLkyV199NRs2bAh4T8ePH0+jRo2YMGGCb03wcGnSpAnp6ekkJyfToEEDevfuTb9+/Xj//ffDWk4O1bBFJDIeqlyEZee7GKDP/PnzGTZsGB988AHr16/ntttuo3379gVePnHGjBlMnjyZcePG8ac//YkBAwbQvXt3+vbty+TJk5kyZQr9+/dnz549vmUmA8WTnp7Ohx9+yKeffsqgQYOoVasWI0aMAODkyZNMnDiR5s2bc/jwYUaNGsWtt97K6tWrAZg5cyaLFy9m4cKFNGzYkH379rFlyxYADhw4QN++fZkyZQo33XQTR48eJTMz01f2m2++Sb9+/XjiiSfo3Lkze/bsYfDgwZw4cSLPl5bHH3+ciRMnMnLkSN544w3uu+8+rr32Wjp27MjZs2f55S9/yaWXXkpmZibHjx9n+PDhnDhxwnf+999/T7du3ejUqRPvvfce8fHxTJs2jR49erBp0yYqVKgAeNa/XrBgAa+88grx8fGUK1eOPn36MHDgQObPn8+pU6dYt24dcXGBBwDPnDmTV199lblz55KRkUGHDh0YMGAAt9xyC5dccsl5x19++eXs3r074PUaNGjAZ5995nff9u3bWb58Ob179w54/oVQwhaREq1ly5ZMmjQJgKSkJJ577jnefvvtAifs1NRUhgwZAsDEiROZPn06TZo08c2pPX78eF544QU2bNhASorf1RMBqFWrFjNnzsTMaN68OVu3bmX69Om+hH3nnXf6jm3UqBGzZs2iRYsW7Nu3j7p167J7926SkpK47rrrMDPq169Pp06dANi/fz+nTp3i5ptvpkGDBgC0atXKd72MjAxGjhzJHXfcAUDjxo159NFH6d+/P1OnTvU1K99www2+FoZ7772XmTNn8vbbb9OxY0feeusttmzZwooVK6hTpw7gSfDXXHONr5yFCxfinGP27Nm+az7zzDPUqFGDJUuWcMsttwCeLydz586lZs2aAHz11VccOXKEX/ziFzRu3BiA5s2bB/3vkpiYyB133MEdd9zB3r17mTdvHjNmzGDYsGH07t2bAQMG0LNnT0qV8jQ4L1u2jFOnTgW8XpkyZc7b1qlTJ9atW8eJEycYNGgQDz/8cNCYCktN4iJSorVu3TrP+9q1a3Pw4MELuk5CQgIVKlTgiiuu8G3LSTr5XbtDhw55+ls7duxIdnY23377LQDr1q2jT58+NGjQgMTERF/y37NnDwDp6emsX7+epKQkhg4dytKlS31N6snJyfTo0YNWrVpx0003MWvWLA4dOuQra+3atWRkZJCQkOD7ue222zh27BgHDhzw+1kh7z3bvHkztWvX9iVrgCuvvNKXEHPK2blzJ4mJib5yKleuzNdff83nn3/uO65u3bq++wZQtWpV0tPTSU1NpVevXkyfPp29e/cGvZ+51atXjzFjxrBx40Zmz57Nm2++Sa9evXz3Djw16CZNmgT8yfmik9uiRYtYt24dCxYsYNmyZTz66KMhx1QQqmGLSGQUoFm6KJ1bYzKzPH3GpUqVwjmX5xh/NTB/18m9LScJ5752QR07dozU1FR69OjB3LlzqVGj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\n",
      "text/plain": [
       "<Figure size 576x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "binned_dist_npass_lt3, binned_dist_npass_ge3 = df.count(binby=['total_amount'],\n",
    "                                                        limits=[5, 50],\n",
    "                                                        shape=64,\n",
    "                                                        selection=[select_n_passengers_lt3, \n",
    "                                                                   select_n_passengers_ge3], \n",
    "                                                        progress='widget')\n",
    "\n",
    "xvalues = np.linspace(5, 50, 64)\n",
    "plt.figure(figsize=(8, 4))\n",
    "plt.plot(xvalues, binned_dist_npass_lt3, drawstyle=\"steps-pre\", label='num passengers < 3', lw=3)\n",
    "plt.plot(xvalues, binned_dist_npass_ge3, drawstyle=\"steps-pre\", label='num passengers >=3', lw=3)\n",
    "plt.legend(fontsize=14)\n",
    "plt.xlabel('Total amount [$]', fontsize=14)\n",
    "plt.ylabel('Number of trips', fontsize=14)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Caption: One can create multiple histograms on different selections with just one pass over the data."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 7. Groupby aggregations with selections\n",
    "\n",
    "One of my favourite features of [Vaex](https://github.com/vaexio/vaex) is the ability to use selections inside aggregation functions. I often find myself wanting to do a group-by operation, in which the aggregations follow some additional rule or filter. The SQL-esque way of doing this would be to run several separate queries in which one would first filter the data and then do the group-by aggregation, and later join the outputs of those aggregations into one table. With Vaex, one can do this with a single operation, and with just one pass over the data! The following group-by example, ran on over 1.1 billion rows takes only 30 seconds to execute on my laptop!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-02-14T10:55:26.617858Z",
     "start_time": "2020-02-14T10:54:56.586569Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table>\n",
       "<thead>\n",
       "<tr><th>#                            </th><th>vendor_id  </th><th style=\"text-align: right;\">      count</th><th style=\"text-align: right;\">  count_fare_n_pass_lt3</th><th style=\"text-align: right;\">  count_fare_n_pass_ge3</th><th style=\"text-align: right;\">  mean_fare_n_pass_lt3</th><th style=\"text-align: right;\">  mean_fare_n_pass_ge3</th></tr>\n",
       "</thead>\n",
       "<tbody>\n",
       "<tr><td><i style='opacity: 0.6'>0</i></td><td>CMT        </td><td style=\"text-align: right;\">5.71882e+08</td><td style=\"text-align: right;\">            5.37345e+08</td><td style=\"text-align: right;\">            3.4537e+07 </td><td style=\"text-align: right;\">               11.0698</td><td style=\"text-align: right;\">               11.917 </td></tr>\n",
       "<tr><td><i style='opacity: 0.6'>1</i></td><td>DDS        </td><td style=\"text-align: right;\">1.41691e+07</td><td style=\"text-align: right;\">            1.30247e+07</td><td style=\"text-align: right;\">            1.14446e+06</td><td style=\"text-align: right;\">               10.3088</td><td style=\"text-align: right;\">               10.8373</td></tr>\n",
       "<tr><td><i style='opacity: 0.6'>2</i></td><td>VTS        </td><td style=\"text-align: right;\">5.87007e+08</td><td style=\"text-align: right;\">            4.38728e+08</td><td style=\"text-align: right;\">            1.48279e+08</td><td style=\"text-align: right;\">               11.4036</td><td style=\"text-align: right;\">               11.1206</td></tr>\n",
       "</tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "  #  vendor_id          count    count_fare_n_pass_lt3    count_fare_n_pass_ge3    mean_fare_n_pass_lt3    mean_fare_n_pass_ge3\n",
       "  0  CMT          5.71882e+08              5.37345e+08              3.4537e+07                  11.0698                 11.917\n",
       "  1  DDS          1.41691e+07              1.30247e+07              1.14446e+06                 10.3088                 10.8373\n",
       "  2  VTS          5.87007e+08              4.38728e+08              1.48279e+08                 11.4036                 11.1206"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.groupby(by='vendor_id', agg={'count': vaex.agg.count(),\n",
    "                                'count_fare_n_pass_lt3': vaex.agg.count(selection='passenger_count<3'),\n",
    "                                'count_fare_n_pass_ge3': vaex.agg.count(selection='passenger_count>=3'),\n",
    "                                'mean_fare_n_pass_lt3': vaex.agg.mean('fare_amount', selection='passenger_count<3'),\n",
    "                                'mean_fare_n_pass_ge3': vaex.agg.mean('fare_amount', selection='passenger_count>=3'),\n",
    "                               })"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Caption: Selections can be used inside groupby aggregation functions."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Bonus: Progress bars"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Looking at the examples above, you may have noticed many of the methods implemented in Vaex are accompanied by a progress bar. I absolutely love this feature! Since I often use Vaex with larger datasets, knowing how long an operation is likely to take is very handy. Besides, it looks pretty and it makes me feel good as a user :)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Conclusion\n",
    "\n",
    "Vaex is a rather powerful DataFrame library, especially when it comes to larger datasets. It has a variety of useful methods for data manipulation and visualization. These are just my top 7 reasons why I like working with this library. What are yours?"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {
     "00221b86a37e44599bafe1536fe73ad3": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "00a16fee86284ba88ad04db92a9655a5": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_e00c8ba24146470ebeed118ef6fcde27",
       "style": "IPY_MODEL_34715d8625654697839587f86726288e",
       "value": " 100.00% elapsed time  :    33.73s =  0.6m =  0.0h cpu: 621%"
      }
     },
     "00f5fef506dc4f4f8170f64bd6057ca1": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_013d04fbe83e4741b87b4dd7904156e5",
        "IPY_MODEL_00a16fee86284ba88ad04db92a9655a5"
       ],
       "layout": "IPY_MODEL_24bc815ceb8c44e0ad237008691968b0"
      }
     },
     "00f6f385d0c44d0dae1c94ec9dac2a97": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "013d04fbe83e4741b87b4dd7904156e5": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_0760c39aa3e646a28d1f39980c0db307",
       "max": 1,
       "style": "IPY_MODEL_aba7888e4c12434bb956b2ab4c4e07cd",
       "value": 1
      }
     },
     "01b9a7bf1c2c4bdbbe8b933cab9daee7": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_073082b6dd7846d29b7aec6570e08916",
       "max": 1,
       "style": "IPY_MODEL_0d1b5e95fb514f958fc6211cfc4eba45",
       "value": 1
      }
     },
     "038a63f97a0646498fc0d85b2de124e8": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "03eec33c68624212b2b33ffa2cbed03c": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_f6e4add5240b48f196cbcc8112166a01",
       "style": "IPY_MODEL_61a3f27cc8d24369a17ac76c2d624b45",
       "value": " 100.00% elapsed time  :    12.76s =  0.2m =  0.0h cpu: 1101%"
      }
     },
     "0516b216b06d46d8a158c9d4927e66b7": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "05de525ceda84f4390c303b97f477323": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "06a7132949614c64bc244ee6050ea022": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_931d71970d9d40d0b57885078316de18",
       "max": 1,
       "style": "IPY_MODEL_b83bf52d93a64347bcf8032ec34341e8",
       "value": 1
      }
     },
     "073082b6dd7846d29b7aec6570e08916": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "0742959cf1694c7b9f46fc8a07d0deb8": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_421342c7f0cc4756b906af7c81f73472",
       "style": "IPY_MODEL_0a57f97e34ba49c08ac06d540fc6ca04",
       "value": " 100.00% elapsed time  :    12.81s =  0.2m =  0.0h cpu: 1145%"
      }
     },
     "0760c39aa3e646a28d1f39980c0db307": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "07ab1bb8a46a497caf3aa66e83ded229": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "07c31800c3ff4f5da4e8a725a3f241a4": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "0833c2923af74671973f874fcf788b01": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_08eda983908c46a598276067a1a42d60",
       "style": "IPY_MODEL_8263cbaa9f574e7daae40f12eb3e70c1",
       "value": " 100.00% elapsed time  :    12.53s =  0.2m =  0.0h cpu: 1136%"
      }
     },
     "08e9a67929a64fa7a3a9f14a1b2ff123": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "08eda983908c46a598276067a1a42d60": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "0a0f12d5a81a47dcac49865ee4d660f0": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_2cba88f64dd340eca95abd25c3ef64d4",
       "max": 1,
       "style": "IPY_MODEL_9858ff13856a4a15bb5801b0b7494e3d",
       "value": 1
      }
     },
     "0a3512db3fe044ba8bdc56dbdf75f455": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "0a57f97e34ba49c08ac06d540fc6ca04": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "0af4d94abe6a4692b7956a9cbc17f49b": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_ef199f37c4e0495eb24c26c279d03289",
       "style": "IPY_MODEL_43a28bc4565d4b6aad08f3b9bc36227a",
       "value": " 100.00% elapsed time  :    12.85s =  0.2m =  0.0h cpu: 1139%"
      }
     },
     "0d1b5e95fb514f958fc6211cfc4eba45": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "0e9727d90d6d4568bb276f59044e45e2": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "0effba6449384a1d9a1e8c22fa4ebcde": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "0faef9d69a22417394f59cb7ab126333": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "10a9df2f76e34fa39dead2533c4d39da": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "11185b76e131467c86d7772356317f72": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "12bbd41a6b454c24a9122c64daa7bd22": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_8e4bdb6e1f12434ea4d2d566eea69a21",
       "max": 1,
       "style": "IPY_MODEL_60ff101447b54f04b94dcdefece31dcd",
       "value": 1
      }
     },
     "131212b053044ea5b7510af01b792b47": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_35fd2844380d4251bf3d06ba12dc93d4",
       "style": "IPY_MODEL_3622228c9a12465a8aeb2947f62191a0",
       "value": " 100.00% elapsed time  :    17.76s =  0.3m =  0.0h cpu: 327%"
      }
     },
     "17aaadc3d33b497cbe8a2cd8ca99c8bc": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "17c43d6d9bbd49eaa2302a5ee89af71b": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "17cdc7b23332446ebb1ec0b9f54bb44f": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_758c25ab1cc34580bc3fb0666be9d6bd",
       "style": "IPY_MODEL_793d3f91963648a3a1a0526546a38bc9",
       "value": " 100.00% elapsed time  :    38.21s =  0.6m =  0.0h cpu: 524%"
      }
     },
     "187f011bec2441c58d6737a50c73ccdb": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_aab6341dd68c43a69da5c9656cc391dd",
       "style": "IPY_MODEL_27de62671041458aa86649173393bc28",
       "value": " 100.00% elapsed time  :     0.71s =  0.0m =  0.0h cpu: 1119%"
      }
     },
     "1946a39e40b0463ba57666e256ebc848": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_86090db4d8ce45a1a424cf76a3c65385",
       "max": 1,
       "style": "IPY_MODEL_766b36b281674cbbbbe5664758ebaa6c",
       "value": 1
      }
     },
     "1c316d0c9bb740288e8f193cedc32e86": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_0effba6449384a1d9a1e8c22fa4ebcde",
       "style": "IPY_MODEL_559a63e181cd4246b655c293b508b0e7",
       "value": " 100.00% elapsed time  :     0.71s =  0.0m =  0.0h cpu: 1120%"
      }
     },
     "1c35727448754af2abb5ef3fd8c0ad5b": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "1e1471c59e7747c3a5a0d43e07d2ce5a": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_409fa804d70443f69dadff0073207c8d",
        "IPY_MODEL_42f2f2bac6364bdcb4ca4f4f93df37d6"
       ],
       "layout": "IPY_MODEL_61f7579f84a241a9a8ecb2fc05006c5c"
      }
     },
     "1f73089f56244922af5127d0dabb6b7d": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "1fd6cc50554c4ccf9ad92f2e78c6011a": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_e0557b18a75c4111925762c2224b2bd8",
       "max": 1,
       "style": "IPY_MODEL_f72100e8217f4b718bdafde6561fe4d4",
       "value": 1
      }
     },
     "21ef644ee65d49359ed02a29199b0e47": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "2230558f090249c0816bbc27dbb41579": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "2233537e6b85408bb2b2957ecf0915b4": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_17aaadc3d33b497cbe8a2cd8ca99c8bc",
       "max": 1,
       "style": "IPY_MODEL_0faef9d69a22417394f59cb7ab126333",
       "value": 1
      }
     },
     "22fda3a439cf4204872aa345e5447c65": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "23747e170d29433b83678673387ac150": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "24693c12d9794be09d8c654489fca39c": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "24bc815ceb8c44e0ad237008691968b0": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "25622fc49ad6408a8aa4f57ce7239c4e": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_69b1a48495054194acd13b77ef7c25d6",
       "style": "IPY_MODEL_340eaaee4ebf400f8db83ef0c5f2ad6d",
       "value": " 100.00% elapsed time  :    30.69s =  0.5m =  0.0h cpu: 569%"
      }
     },
     "27179006c7dd49d4a811ac3fda56607d": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_ff3fd3f23df944d28a2e4cd6ac313427",
       "style": "IPY_MODEL_5b17e42f88e444d6a559b24425a79109",
       "value": " 100.00% elapsed time  :    12.85s =  0.2m =  0.0h cpu: 1143%"
      }
     },
     "27207d24a4044609812521335ae62790": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_cd8da2311de74985b4e25bd29679dc01",
       "max": 1,
       "style": "IPY_MODEL_de71f58947ad4e6ba67fa6a0278e8e55",
       "value": 1
      }
     },
     "27de62671041458aa86649173393bc28": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "2a5a6718948a49dca24e83b081858d5e": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_d10c6a07572344f2a9b338998e87fb1b",
       "style": "IPY_MODEL_5354b0c2d0b942a7a6b5d7af2ee67989",
       "value": " 100.00% elapsed time  :     0.72s =  0.0m =  0.0h cpu: 1109%"
      }
     },
     "2c1f6ca9964644fa99841ed010c879a3": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_3ba8db971abd41d79459392eef214ac1",
        "IPY_MODEL_1c316d0c9bb740288e8f193cedc32e86"
       ],
       "layout": "IPY_MODEL_db4495a19c90419fa8055f77fe0126c1"
      }
     },
     "2c2c4990ea554eeaae5d24f0daba8964": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "2cba88f64dd340eca95abd25c3ef64d4": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "2cbd0cfc2c754580a7106af72e0f7f09": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_4d7444ff32f040f98784a2db37280141",
       "max": 1,
       "style": "IPY_MODEL_ca839e525a1a42068debd670b5198e64",
       "value": 1
      }
     },
     "2cf439d724cc4243bff65181efdc2241": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "2dbcc28812b04fd2a3714dfa9ff6ea7b": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "2dcd5541668f43eab442eb69da0d2509": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_edd4df9fecc24c19ade14591e1fb9234",
        "IPY_MODEL_b3b9212ad3d046388333ebcdeb4869ef"
       ],
       "layout": "IPY_MODEL_f8cd216e54124845bdcff36a1671d9a5"
      }
     },
     "2de8d81703dc4d22a5a6df6516e4d021": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "2f2089c792d04584999d145371b884f3": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_527206ae470d46d1a6070dcdcf99f25a",
        "IPY_MODEL_54c985dd6d3d46988bcb30810243c03f"
       ],
       "layout": "IPY_MODEL_cebd3fedd3f244d6a59c6ec0fc3f8db4"
      }
     },
     "2fb3a7c6ba9f46359200f565f3b8bd04": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "30d998154d034ae2820aa15597b4e906": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "3205a62320eb4e938c3b74e338750cf0": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_e93a3795bb424dbca63791d08119544a",
        "IPY_MODEL_4e957abe04294d85ad5e175811038fe6"
       ],
       "layout": "IPY_MODEL_3502deaf69d64231a77fb776eb88d3cf"
      }
     },
     "32aa05d953054364b61185ffb8e8a7f0": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_91901c0a12f3466ba99eb977447b2024",
       "max": 1,
       "style": "IPY_MODEL_30d998154d034ae2820aa15597b4e906",
       "value": 1
      }
     },
     "32b051945319412eacae1a6cd1f01f8a": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_2cbd0cfc2c754580a7106af72e0f7f09",
        "IPY_MODEL_de0fa0e198094a8f8c6370105d26b4b0"
       ],
       "layout": "IPY_MODEL_b024b63836b84be6befe036747fd71be"
      }
     },
     "32b44abf760f47adab22b9d0f77f3333": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_9c1b863f929b4781a04f6eb361ff3390",
        "IPY_MODEL_131212b053044ea5b7510af01b792b47"
       ],
       "layout": "IPY_MODEL_c25b9de123db4f47948383b97d937a56"
      }
     },
     "340eaaee4ebf400f8db83ef0c5f2ad6d": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "3429411fb35f4a5ab118fa1dc43f0cf2": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "3456f9ea97ab4f0ebc558c0986124396": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "34715d8625654697839587f86726288e": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "3502deaf69d64231a77fb776eb88d3cf": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "35280158a3034f2ea010eb2287920314": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "35fd2844380d4251bf3d06ba12dc93d4": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "3622228c9a12465a8aeb2947f62191a0": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "36da69c0c05949d69863899d76b5ab81": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "38e72e7654664e74bbfe2492fd768e65": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_80cec6077165444687518e5d499d2c39",
        "IPY_MODEL_9a41a38e3bb84b83afb3381a77916206"
       ],
       "layout": "IPY_MODEL_038a63f97a0646498fc0d85b2de124e8"
      }
     },
     "3a178b8f48504af5aa08268849daac12": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_c3b4352955cf44f5a2aad0595ba82bb6",
        "IPY_MODEL_d5c202e9b74a4a409046e17c465dfcb5"
       ],
       "layout": "IPY_MODEL_b0906d191d694f628f3c93af88f01989"
      }
     },
     "3b5f866d1cc5407aa4d03d821f0d3137": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "3ba8db971abd41d79459392eef214ac1": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_e484200db4864092be12e8a0b3df1a42",
       "max": 1,
       "style": "IPY_MODEL_843b8a7c66a1460d8db88775efd0e6f9",
       "value": 1
      }
     },
     "3c9f6b9388f54ac49baf61c2fe7c3138": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "3cd48be7f98b4e3a839b2d15d7cbdb2b": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "3db82a78e9ec4ae3b217177aa8f6df8b": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_98146f87bc6344a9842c0c064337cbb9",
       "style": "IPY_MODEL_2dbcc28812b04fd2a3714dfa9ff6ea7b",
       "value": " 100.00% elapsed time  :    13.97s =  0.2m =  0.0h cpu: 358%"
      }
     },
     "3f269291b58041f1a1361020bf5bc8e8": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_12bbd41a6b454c24a9122c64daa7bd22",
        "IPY_MODEL_aa189a66f10b4ca182c83fba0dc09db6"
       ],
       "layout": "IPY_MODEL_d08222cdc61549a6a7b7a15ef677cc79"
      }
     },
     "40041fa4c837434dafbce96b5966e2b3": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "409fa804d70443f69dadff0073207c8d": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_d7158e5ede434c9cb26f8d64cbbc0250",
       "max": 1,
       "style": "IPY_MODEL_d9216cc03d174b7c89d487ccea4a57f8",
       "value": 1
      }
     },
     "41f32696c7ff4244a0f878afa4a3aa61": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "421342c7f0cc4756b906af7c81f73472": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "42f2f2bac6364bdcb4ca4f4f93df37d6": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_74eb30b970fd4cc6a027befe4e64e6ec",
       "style": "IPY_MODEL_90d95846d5134d90aa737d88f0d29839",
       "value": " 100.00% elapsed time  :    12.89s =  0.2m =  0.0h cpu: 1116%"
      }
     },
     "434578b4e23149b7b8dc50bb02dd9145": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "434d56a120134e52ad6f6a437ef73d28": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_dc2e9c70ac79407fa18f56ff8da048b5",
       "style": "IPY_MODEL_a06f3318b5c648a79dbd38aa34ba6651",
       "value": " 100.00% elapsed time  :     5.98s =  0.1m =  0.0h cpu: 360%"
      }
     },
     "43a28bc4565d4b6aad08f3b9bc36227a": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "43dbecd38c584b35aeb431b6ce7a454a": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "44bb9eee42644a62ab675696357c2f36": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "45918df9ca1b4d6abee09feaa3326b49": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "45ecfd37188047178ca1bdcad54e3046": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "46877b3c203a4fdca9817e231423442d": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "46bebbcd38944abe8e4b60b5eefe9d01": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "46deeb3a29b14cf38ac1b92f48d67d24": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "477f97b9cfda495e9e6648c22b17f106": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "49edfb96b2e549cba817551775fb956f": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_e66fec75fd724ae4b52df5bb9d350f9d",
        "IPY_MODEL_fe5596a613524f14b907e22ff465a421"
       ],
       "layout": "IPY_MODEL_2fb3a7c6ba9f46359200f565f3b8bd04"
      }
     },
     "4a92f282bf07440abfa08c3c224d1b47": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_c52c9c6eee6e404b9d371abbae498fca",
       "style": "IPY_MODEL_3456f9ea97ab4f0ebc558c0986124396",
       "value": " 100.00% elapsed time  :     0.72s =  0.0m =  0.0h cpu: 1073%"
      }
     },
     "4a9c946913c442f1aea97537a1dba1e8": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "4d058972c61d401caa3a5b8c8fca82e0": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "4d4825b24cf34c0ca7b7e4d9d6d95bee": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "4d7444ff32f040f98784a2db37280141": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "4e957abe04294d85ad5e175811038fe6": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_f9cc140807d94fd3a7b075b6c0992113",
       "style": "IPY_MODEL_cf036b8cc2134776995c4a279c6fc0dc",
       "value": " 100.00% elapsed time  :     5.75s =  0.1m =  0.0h cpu: 711%"
      }
     },
     "4f4897d07f0e414586efddcc8c9bb62f": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_b8752b4633934f048cf0eaa16a81203e",
        "IPY_MODEL_58ff1c060ed34bd5a0cbf65c4bbdbfce"
       ],
       "layout": "IPY_MODEL_cdd364f41ae6484496ab4bf97393d604"
      }
     },
     "5172870fa20a467db22e8607e1c66cf1": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "51c4b3801a35423f909839f9a8bb6bf6": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_32aa05d953054364b61185ffb8e8a7f0",
        "IPY_MODEL_b0ffa314f0854f37b3e5e49903127894"
       ],
       "layout": "IPY_MODEL_23747e170d29433b83678673387ac150"
      }
     },
     "527206ae470d46d1a6070dcdcf99f25a": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_633f4d6e50fb4970ac6bebde3ffbcd00",
       "max": 1,
       "style": "IPY_MODEL_82525be8700f474fbefee49bbbffa7ed",
       "value": 1
      }
     },
     "5354b0c2d0b942a7a6b5d7af2ee67989": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "541f1f9f05db41328a1313850a0edb6a": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_84257c39c3424ca39db2b9a32432cfd5",
       "max": 1,
       "style": "IPY_MODEL_5a40e33ad21540868dbb1cbb1c8b4471",
       "value": 1
      }
     },
     "54c985dd6d3d46988bcb30810243c03f": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_45ecfd37188047178ca1bdcad54e3046",
       "style": "IPY_MODEL_9adf80e311674a09b8405a922c93317a",
       "value": " 100.00% elapsed time  :     0.70s =  0.0m =  0.0h cpu: 1121%"
      }
     },
     "559a63e181cd4246b655c293b508b0e7": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "55dfdf279579445b838ec0d33f7ea288": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "5603678837ab4219b9ce688505b932b2": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_ce72577c46434932bf61b2cfe4984067",
        "IPY_MODEL_abf0976d506c4b458da5654d22b13c48"
       ],
       "layout": "IPY_MODEL_b8583d49d13d44eaa4cdf2cba8ed56a8"
      }
     },
     "560eb40d1c464fb08deb280896a024b0": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "5624099c59064b4d87f2086aaa6027f1": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "572b281151f8425e8d00daac34d3456d": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_e2ba73945fd64166b64916540e3b9034",
       "style": "IPY_MODEL_74a4dd44785340c3a96629be333ad052",
       "value": " 100.00% elapsed time  :    29.15s =  0.5m =  0.0h cpu: 570%"
      }
     },
     "57a2c6d6b0c543459d2da93c017f4216": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "5807801d162548109c909a989370c5a7": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "588c90725f48419785c1765c92fa5165": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_3429411fb35f4a5ab118fa1dc43f0cf2",
       "max": 1,
       "style": "IPY_MODEL_41f32696c7ff4244a0f878afa4a3aa61",
       "value": 1
      }
     },
     "58ff1c060ed34bd5a0cbf65c4bbdbfce": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_7fd198d5dedf4456a73c5481f82012fe",
       "style": "IPY_MODEL_ae205f1805374ac2bce4466536aa8f22",
       "value": " 100.00% elapsed time  :    14.00s =  0.2m =  0.0h cpu: 1002%"
      }
     },
     "5906ace200314583b5d4d2bf76d53df1": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_61c1ea9bc7c84f4793da461299bbdb08",
       "style": "IPY_MODEL_45918df9ca1b4d6abee09feaa3326b49",
       "value": " 100.00% elapsed time  :     6.44s =  0.1m =  0.0h cpu: 348%"
      }
     },
     "5a40e33ad21540868dbb1cbb1c8b4471": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "5b17e42f88e444d6a559b24425a79109": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "60ff101447b54f04b94dcdefece31dcd": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "61a3f27cc8d24369a17ac76c2d624b45": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "61c1ea9bc7c84f4793da461299bbdb08": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "61f7579f84a241a9a8ecb2fc05006c5c": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "62230d6bf6d94790a34c16b99bc93c87": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "6241be3cb4ca40998f3eab46d6fbdef3": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_541f1f9f05db41328a1313850a0edb6a",
        "IPY_MODEL_0af4d94abe6a4692b7956a9cbc17f49b"
       ],
       "layout": "IPY_MODEL_e339b5b4cd0a4090974dd8612524d276"
      }
     },
     "62f38fd28abc481595db3397148b62d8": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "6321917428f146bf81c27be835743882": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "633f4d6e50fb4970ac6bebde3ffbcd00": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "6495cbc3b7584ec49bf1ec92b83bec6d": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_b071b1fcb9ef4cc6b7f8879ff946cabf",
        "IPY_MODEL_187f011bec2441c58d6737a50c73ccdb"
       ],
       "layout": "IPY_MODEL_fee2fab921c540878e5e0a77a8566f23"
      }
     },
     "64ec3d3a94594974844afcbe9dc2c4d6": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "68212aa6d788488284c19bcbb4b23aa2": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "6840117ebb5549649875bd6a4d57ec3d": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "68484f881f83456d93f1a43ede5ec8ab": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "69524e4e91d04ff681ef98c7afd3045e": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "69b1a48495054194acd13b77ef7c25d6": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "6bc0cf53518e416986f4329a1096a12d": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "6d33fce6c341443d953fdc3e5bad709b": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "6f19b5eb84ce48aa84306304669f4c33": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "7122738a790d4dc58906017f2ad306aa": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "714d08dde5bc4f9b8660651afd4aabc7": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_dfc1123927b4474db791915e148c68e0",
        "IPY_MODEL_830ff3fc109a429db900f97bcc9bc150"
       ],
       "layout": "IPY_MODEL_5624099c59064b4d87f2086aaa6027f1"
      }
     },
     "72eed79598104f598e2a0dad3e125ca5": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_c894b2ae1ce842c2804228c96a85b531",
        "IPY_MODEL_0833c2923af74671973f874fcf788b01"
       ],
       "layout": "IPY_MODEL_c7da6b222a7146e59d9e569770dd8dca"
      }
     },
     "7309c44f220840328f000e1188e42d91": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_01b9a7bf1c2c4bdbbe8b933cab9daee7",
        "IPY_MODEL_cb467f43d620409c9f755efcee5a947f"
       ],
       "layout": "IPY_MODEL_b5008822c87b4a0eb2564df84124c8cf"
      }
     },
     "74a4dd44785340c3a96629be333ad052": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "74eb30b970fd4cc6a027befe4e64e6ec": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "758c25ab1cc34580bc3fb0666be9d6bd": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "766b36b281674cbbbbe5664758ebaa6c": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "775b27d9df36496ca970e729b3f7d7b7": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "791b912d474940bd9bdd30e0d076bfe8": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "793d3f91963648a3a1a0526546a38bc9": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "79faaad36c7b4a48a86f0b479685a82c": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_c7a35c006bfa43b187ec20b23b1804fd",
        "IPY_MODEL_25622fc49ad6408a8aa4f57ce7239c4e"
       ],
       "layout": "IPY_MODEL_8275363b20a44441a3e4c70a116d9c6a"
      }
     },
     "7a96bc3087764915a48715ced97dd008": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "7cc38c5db68146ab959c29a7ffa79611": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_c63d6f542bfd40e69860e37303aa520c",
       "style": "IPY_MODEL_b29c9d59c46147acbb1350c8c5bf84b6",
       "value": " 100.00% elapsed time  :    32.78s =  0.5m =  0.0h cpu: 509%"
      }
     },
     "7df70d5448b64fdaa473ef572c694eda": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_22fda3a439cf4204872aa345e5447c65",
       "style": "IPY_MODEL_fdf40fdde1fa4c9a9cf46ce7add54e0e",
       "value": " 100.00% elapsed time  :     0.70s =  0.0m =  0.0h cpu: 1110%"
      }
     },
     "7fd198d5dedf4456a73c5481f82012fe": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "80cec6077165444687518e5d499d2c39": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_07ab1bb8a46a497caf3aa66e83ded229",
       "max": 1,
       "style": "IPY_MODEL_00221b86a37e44599bafe1536fe73ad3",
       "value": 1
      }
     },
     "80dc3198d4374edab4bcc590fc5560b5": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "82525be8700f474fbefee49bbbffa7ed": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "826326b540104685b9fc67654d660e7c": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "8263cbaa9f574e7daae40f12eb3e70c1": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "8275363b20a44441a3e4c70a116d9c6a": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "830ff3fc109a429db900f97bcc9bc150": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_434578b4e23149b7b8dc50bb02dd9145",
       "style": "IPY_MODEL_dfb98281da9f483584ab885163750d49",
       "value": " 100.00% elapsed time  :    32.42s =  0.5m =  0.0h cpu: 636%"
      }
     },
     "84257c39c3424ca39db2b9a32432cfd5": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "843b8a7c66a1460d8db88775efd0e6f9": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "86090db4d8ce45a1a424cf76a3c65385": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "86635debda3f4ee1802452342f4037d7": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "89dc0187eb624c63ba9c7694b039188e": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_e38b3f88bcbc4008ba291a9816c1b87d",
       "max": 1,
       "style": "IPY_MODEL_0e9727d90d6d4568bb276f59044e45e2",
       "value": 1
      }
     },
     "8bb2fc61697444df8673a7adac29e9ea": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "8bcd4630a7154ff89df6e1faa2be1e2f": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "8ceafb99faa04685ab3607dbce998e4c": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_92fe7b5755f843668ab8364508e4d028",
        "IPY_MODEL_f15ab54207974eeaa3253dda4c2419bf"
       ],
       "layout": "IPY_MODEL_64ec3d3a94594974844afcbe9dc2c4d6"
      }
     },
     "8e4bdb6e1f12434ea4d2d566eea69a21": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "8f1deb5660fa431cbdcc1d82a99ac3bb": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_8bb2fc61697444df8673a7adac29e9ea",
       "max": 1,
       "style": "IPY_MODEL_5172870fa20a467db22e8607e1c66cf1",
       "value": 1
      }
     },
     "90d95846d5134d90aa737d88f0d29839": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "91901c0a12f3466ba99eb977447b2024": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "92fe7b5755f843668ab8364508e4d028": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_a8094ffe910148cd991462de80ae8ec2",
       "max": 1,
       "style": "IPY_MODEL_ca0a42909b6d4a73b4456c6d56bf00b2",
       "value": 1
      }
     },
     "931d71970d9d40d0b57885078316de18": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "95ab145b4f7d47258e7e519b70a89efe": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "96de2725f88e4e03a67562f7dd90316d": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "98146f87bc6344a9842c0c064337cbb9": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "9858ff13856a4a15bb5801b0b7494e3d": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "98e30ebf732f4de08e6781becea48b25": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "9a41a38e3bb84b83afb3381a77916206": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_10a9df2f76e34fa39dead2533c4d39da",
       "style": "IPY_MODEL_f4f3e2a2e3de4f7299ab0a2c2ef87668",
       "value": " 100.00% elapsed time  :    28.38s =  0.5m =  0.0h cpu: 644%"
      }
     },
     "9adf80e311674a09b8405a922c93317a": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "9ae7b7ad855e4952aeab88e9faf63b3c": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "9c1b863f929b4781a04f6eb361ff3390": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_e34de64e6d834ce88c87c8940e6ec1b1",
       "max": 1,
       "style": "IPY_MODEL_ae05e5e6fa224a789139b548b7b7712f",
       "value": 1
      }
     },
     "9d0c9f4613b0488cb4d432b723eabbf0": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_c4575ae4fedb4c73b0d773701fc2217b",
       "max": 1,
       "style": "IPY_MODEL_baf310a539644a0daef8343dfb084cf3",
       "value": 1
      }
     },
     "a03d5cb76c0c46e995d2ed4153362f59": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_cee1ef89af28408c975dcc8cd4ddfa5d",
       "max": 1,
       "style": "IPY_MODEL_96de2725f88e4e03a67562f7dd90316d",
       "value": 1
      }
     },
     "a06f3318b5c648a79dbd38aa34ba6651": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "a098267479be4d8cbed257366549148d": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "a099f032e6b14c3099c4320eb4b8daff": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_c473e0245fb54e408a8e9cfec3d65133",
       "max": 1,
       "style": "IPY_MODEL_ca8b7aa1b8a44da68b109cae0e16aa1c",
       "value": 1
      }
     },
     "a4562b7fc1164a7489ea3dc704e524e6": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_6d33fce6c341443d953fdc3e5bad709b",
       "style": "IPY_MODEL_62230d6bf6d94790a34c16b99bc93c87",
       "value": " 100.00% elapsed time  :    12.22s =  0.2m =  0.0h cpu: 1142%"
      }
     },
     "a4d0ea3cb6cf4bd68b60bc3e6836890e": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_27207d24a4044609812521335ae62790",
        "IPY_MODEL_27179006c7dd49d4a811ac3fda56607d"
       ],
       "layout": "IPY_MODEL_826326b540104685b9fc67654d660e7c"
      }
     },
     "a61473f48d9741a781f2b1b1fe0e7d12": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "a6bbfa34e9ea44ec909bcf13c3fdeb4a": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "a6fea2c012dc43ce8e17b8c9ce2b2b5e": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_e9a81e8b58654686995b5a03854ebd56",
        "IPY_MODEL_7df70d5448b64fdaa473ef572c694eda"
       ],
       "layout": "IPY_MODEL_afa77a4fe7444bd9bcccd761074f41c4"
      }
     },
     "a787a434b2b7435fab06a5bb905f2640": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "a7cd424580274e7cb905f7e42d9ca10b": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_44bb9eee42644a62ab675696357c2f36",
       "style": "IPY_MODEL_2cf439d724cc4243bff65181efdc2241",
       "value": " 100.00% elapsed time  :     7.14s =  0.1m =  0.0h cpu: 606%"
      }
     },
     "a8094ffe910148cd991462de80ae8ec2": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "aa189a66f10b4ca182c83fba0dc09db6": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_68484f881f83456d93f1a43ede5ec8ab",
       "style": "IPY_MODEL_7a96bc3087764915a48715ced97dd008",
       "value": " 100.00% elapsed time  :     6.72s =  0.1m =  0.0h cpu: 617%"
      }
     },
     "aab6341dd68c43a69da5c9656cc391dd": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "aba7888e4c12434bb956b2ab4c4e07cd": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "abf0976d506c4b458da5654d22b13c48": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_3cd48be7f98b4e3a839b2d15d7cbdb2b",
       "style": "IPY_MODEL_fe7bc9203b2a4fa2939e53d680790427",
       "value": " 100.00% elapsed time  :     1.38s =  0.0m =  0.0h cpu: 636%"
      }
     },
     "adbcf1f0e0694e4099429ce403b23f88": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "ae05e5e6fa224a789139b548b7b7712f": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "ae205f1805374ac2bce4466536aa8f22": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "afa77a4fe7444bd9bcccd761074f41c4": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "b024b63836b84be6befe036747fd71be": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "b071b1fcb9ef4cc6b7f8879ff946cabf": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_bc85d93b610e4e5c889d85cbb1997398",
       "max": 1,
       "style": "IPY_MODEL_477f97b9cfda495e9e6648c22b17f106",
       "value": 1
      }
     },
     "b0906d191d694f628f3c93af88f01989": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "b0a90f6adb8d4443b495b30af7333781": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "b0ffa314f0854f37b3e5e49903127894": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_07c31800c3ff4f5da4e8a725a3f241a4",
       "style": "IPY_MODEL_2c2c4990ea554eeaae5d24f0daba8964",
       "value": " 100.00% elapsed time  :     0.87s =  0.0m =  0.0h cpu: 944%"
      }
     },
     "b1e0f515814a47ffb0d9027c34a70ffd": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_f4241116a621450fbfb226b554c3cb66",
        "IPY_MODEL_c32c98b5eeaa4e48a571cec3cc290bd5"
       ],
       "layout": "IPY_MODEL_a6bbfa34e9ea44ec909bcf13c3fdeb4a"
      }
     },
     "b29c9d59c46147acbb1350c8c5bf84b6": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "b2c9bc4c513c4b42a76a5dd90bd4df87": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_06a7132949614c64bc244ee6050ea022",
        "IPY_MODEL_572b281151f8425e8d00daac34d3456d"
       ],
       "layout": "IPY_MODEL_2de8d81703dc4d22a5a6df6516e4d021"
      }
     },
     "b3b9212ad3d046388333ebcdeb4869ef": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_560eb40d1c464fb08deb280896a024b0",
       "style": "IPY_MODEL_46877b3c203a4fdca9817e231423442d",
       "value": " 100.00% elapsed time  :     6.78s =  0.1m =  0.0h cpu: 355%"
      }
     },
     "b43c4d2d5aef4540a5a13df5592a10b9": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "b5008822c87b4a0eb2564df84124c8cf": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "b83bf52d93a64347bcf8032ec34341e8": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "b8583d49d13d44eaa4cdf2cba8ed56a8": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "b8752b4633934f048cf0eaa16a81203e": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_3b5f866d1cc5407aa4d03d821f0d3137",
       "max": 1,
       "style": "IPY_MODEL_dda77dd49e4a48d39aec2024e1612573",
       "value": 1
      }
     },
     "b9531b2b9fe2425489acf4bd0b296c63": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_ef6f88f54d7e4ad3ac4c753805153efe",
        "IPY_MODEL_0742959cf1694c7b9f46fc8a07d0deb8"
       ],
       "layout": "IPY_MODEL_e1d9e147b4ac4560a70157c584cdf5af"
      }
     },
     "b9e0fdf2491742e5a04fb3e8225bac51": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "bacd1e5c163641a681b334eb850ab896": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_791b912d474940bd9bdd30e0d076bfe8",
       "max": 1,
       "style": "IPY_MODEL_35280158a3034f2ea010eb2287920314",
       "value": 1
      }
     },
     "baf310a539644a0daef8343dfb084cf3": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "bb5134509755412f9de8c231f0af9d59": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_d0e914ed40774a02835d7994b0a5d5df",
       "style": "IPY_MODEL_cc31983c93e6435aaf20e5be14ff6c50",
       "value": " 100.00% elapsed time  :    10.96s =  0.2m =  0.0h cpu: 414%"
      }
     },
     "bc85d93b610e4e5c889d85cbb1997398": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "c0c2eb71003b4682a1d50da83928d3a1": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_dd3a6f1c78a0454294078e7a134cab50",
       "style": "IPY_MODEL_adbcf1f0e0694e4099429ce403b23f88",
       "value": " 100.00% elapsed time  :     2.42s =  0.0m =  0.0h cpu: 827%"
      }
     },
     "c18247f9adfe40d296cc4b59c4910cb7": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_2233537e6b85408bb2b2957ecf0915b4",
        "IPY_MODEL_17cdc7b23332446ebb1ec0b9f54bb44f"
       ],
       "layout": "IPY_MODEL_00f6f385d0c44d0dae1c94ec9dac2a97"
      }
     },
     "c1de7d491d9e42a285c1f45aca85970c": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "c2524e19f2ac42788037747a2dfddd4b": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_1946a39e40b0463ba57666e256ebc848",
        "IPY_MODEL_c0c2eb71003b4682a1d50da83928d3a1"
       ],
       "layout": "IPY_MODEL_a787a434b2b7435fab06a5bb905f2640"
      }
     },
     "c25b9de123db4f47948383b97d937a56": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "c312343208d747368c973f87d37af284": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_f7ec341be29345c3b5be7bcaf6847da4",
       "max": 1,
       "style": "IPY_MODEL_6f19b5eb84ce48aa84306304669f4c33",
       "value": 1
      }
     },
     "c32c98b5eeaa4e48a571cec3cc290bd5": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_775b27d9df36496ca970e729b3f7d7b7",
       "style": "IPY_MODEL_0a3512db3fe044ba8bdc56dbdf75f455",
       "value": " 100.00% elapsed time  :     0.70s =  0.0m =  0.0h cpu: 1122%"
      }
     },
     "c3b4352955cf44f5a2aad0595ba82bb6": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_6321917428f146bf81c27be835743882",
       "max": 1,
       "style": "IPY_MODEL_86635debda3f4ee1802452342f4037d7",
       "value": 1
      }
     },
     "c4575ae4fedb4c73b0d773701fc2217b": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "c473e0245fb54e408a8e9cfec3d65133": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "c52c9c6eee6e404b9d371abbae498fca": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "c63d6f542bfd40e69860e37303aa520c": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "c6d7e7834c424eeabd6101afe191af10": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_d0087f3b9c7a48a3b9dcad7711841877",
        "IPY_MODEL_5906ace200314583b5d4d2bf76d53df1"
       ],
       "layout": "IPY_MODEL_69524e4e91d04ff681ef98c7afd3045e"
      }
     },
     "c7a35c006bfa43b187ec20b23b1804fd": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_95ab145b4f7d47258e7e519b70a89efe",
       "max": 1,
       "style": "IPY_MODEL_f1420e777cdf4f42aae667f7df9529dc",
       "value": 1
      }
     },
     "c7da6b222a7146e59d9e569770dd8dca": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "c894b2ae1ce842c2804228c96a85b531": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_46bebbcd38944abe8e4b60b5eefe9d01",
       "max": 1,
       "style": "IPY_MODEL_fb592d86fa5b42f59cf0c46a38e848ae",
       "value": 1
      }
     },
     "ca0a42909b6d4a73b4456c6d56bf00b2": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "ca839e525a1a42068debd670b5198e64": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "ca8b7aa1b8a44da68b109cae0e16aa1c": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "cb467f43d620409c9f755efcee5a947f": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_a61473f48d9741a781f2b1b1fe0e7d12",
       "style": "IPY_MODEL_f5410bda66ec440292d57beb231ce411",
       "value": " 100.00% elapsed time  :    13.02s =  0.2m =  0.0h cpu: 1103%"
      }
     },
     "cc31983c93e6435aaf20e5be14ff6c50": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "ccebbe0638da4318814b332cb007d67f": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "cd8da2311de74985b4e25bd29679dc01": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "cd91782eb1cd4cb8a6e1302fcca7c5af": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_d5bfb8e6125a492c89526b3dda17cdb1",
       "max": 1,
       "style": "IPY_MODEL_ef2e37021b82442b9529ae5766fee15b",
       "value": 1
      }
     },
     "cdd364f41ae6484496ab4bf97393d604": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "ce3cc5f45de742c494a97521d3769b48": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_f97acbc63f1e4ee3b9de44c17bbcb985",
       "max": 1,
       "style": "IPY_MODEL_e05c601f0e3347fd88271a5ae29b323b",
       "value": 1
      }
     },
     "ce72577c46434932bf61b2cfe4984067": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_f92f8869ab2d488a96b069e9fa61618d",
       "max": 1,
       "style": "IPY_MODEL_6840117ebb5549649875bd6a4d57ec3d",
       "value": 1
      }
     },
     "cebd3fedd3f244d6a59c6ec0fc3f8db4": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "cee1ef89af28408c975dcc8cd4ddfa5d": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "cf036b8cc2134776995c4a279c6fc0dc": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "cf77613605114b809c6d01d249635a2f": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_bacd1e5c163641a681b334eb850ab896",
        "IPY_MODEL_a7cd424580274e7cb905f7e42d9ca10b"
       ],
       "layout": "IPY_MODEL_68212aa6d788488284c19bcbb4b23aa2"
      }
     },
     "d0068db9b8fa4e1886f4b6c04b1962e4": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_ce3cc5f45de742c494a97521d3769b48",
        "IPY_MODEL_03eec33c68624212b2b33ffa2cbed03c"
       ],
       "layout": "IPY_MODEL_1c35727448754af2abb5ef3fd8c0ad5b"
      }
     },
     "d0087f3b9c7a48a3b9dcad7711841877": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_4d4825b24cf34c0ca7b7e4d9d6d95bee",
       "max": 1,
       "style": "IPY_MODEL_21ef644ee65d49359ed02a29199b0e47",
       "value": 1
      }
     },
     "d08222cdc61549a6a7b7a15ef677cc79": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "d0e914ed40774a02835d7994b0a5d5df": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "d10c6a07572344f2a9b338998e87fb1b": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "d38b30728dd444e59e670b63d8214568": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_40041fa4c837434dafbce96b5966e2b3",
       "style": "IPY_MODEL_b9e0fdf2491742e5a04fb3e8225bac51",
       "value": " 100.00% elapsed time  :    31.73s =  0.5m =  0.0h cpu: 655%"
      }
     },
     "d5bfb8e6125a492c89526b3dda17cdb1": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "d5c202e9b74a4a409046e17c465dfcb5": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_5807801d162548109c909a989370c5a7",
       "style": "IPY_MODEL_0516b216b06d46d8a158c9d4927e66b7",
       "value": " 100.00% elapsed time  :    14.60s =  0.2m =  0.0h cpu: 350%"
      }
     },
     "d7158e5ede434c9cb26f8d64cbbc0250": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "d9216cc03d174b7c89d487ccea4a57f8": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "d92b49e6a9614d3889e69c5b5d628856": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "db4495a19c90419fa8055f77fe0126c1": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "dc2e9c70ac79407fa18f56ff8da048b5": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "dcbacc4290474b2eaebd00462b525600": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "dd3a6f1c78a0454294078e7a134cab50": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "dda77dd49e4a48d39aec2024e1612573": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "de0fa0e198094a8f8c6370105d26b4b0": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_f5bcb62dd88f4174a00c460074c752e1",
       "style": "IPY_MODEL_08e9a67929a64fa7a3a9f14a1b2ff123",
       "value": " 100.00% elapsed time  :     5.90s =  0.1m =  0.0h cpu: 360%"
      }
     },
     "de5da09314ff49fcbffb829be4d54934": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "de71f58947ad4e6ba67fa6a0278e8e55": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "decce0859b5c4f86b2184de0e9b7383e": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "dfb98281da9f483584ab885163750d49": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "dfc1123927b4474db791915e148c68e0": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_a098267479be4d8cbed257366549148d",
       "max": 1,
       "style": "IPY_MODEL_46deeb3a29b14cf38ac1b92f48d67d24",
       "value": 1
      }
     },
     "e00c8ba24146470ebeed118ef6fcde27": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "e0557b18a75c4111925762c2224b2bd8": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "e05c601f0e3347fd88271a5ae29b323b": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "e0fb6fc8c5304fbaa7874c9c3f9a2be7": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_cd91782eb1cd4cb8a6e1302fcca7c5af",
        "IPY_MODEL_4a92f282bf07440abfa08c3c224d1b47"
       ],
       "layout": "IPY_MODEL_7122738a790d4dc58906017f2ad306aa"
      }
     },
     "e1d9e147b4ac4560a70157c584cdf5af": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "e26c2400ded043b5aafd2de374ed01ca": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_8f1deb5660fa431cbdcc1d82a99ac3bb",
        "IPY_MODEL_3db82a78e9ec4ae3b217177aa8f6df8b"
       ],
       "layout": "IPY_MODEL_d92b49e6a9614d3889e69c5b5d628856"
      }
     },
     "e2ba73945fd64166b64916540e3b9034": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "e2eab791861648e5b9ff9f76f5a49d5d": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_1fd6cc50554c4ccf9ad92f2e78c6011a",
        "IPY_MODEL_bb5134509755412f9de8c231f0af9d59"
       ],
       "layout": "IPY_MODEL_decce0859b5c4f86b2184de0e9b7383e"
      }
     },
     "e339b5b4cd0a4090974dd8612524d276": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "e34de64e6d834ce88c87c8940e6ec1b1": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "e38b3f88bcbc4008ba291a9816c1b87d": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "e484200db4864092be12e8a0b3df1a42": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "e612489cae424c1bbadcdf3ec472a047": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_a03d5cb76c0c46e995d2ed4153362f59",
        "IPY_MODEL_2a5a6718948a49dca24e83b081858d5e"
       ],
       "layout": "IPY_MODEL_17c43d6d9bbd49eaa2302a5ee89af71b"
      }
     },
     "e66fec75fd724ae4b52df5bb9d350f9d": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_b43c4d2d5aef4540a5a13df5592a10b9",
       "max": 1,
       "style": "IPY_MODEL_8bcd4630a7154ff89df6e1faa2be1e2f",
       "value": 1
      }
     },
     "e713b972e22f413e88e8c0f95ac6ce5a": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_0a0f12d5a81a47dcac49865ee4d660f0",
        "IPY_MODEL_f3ebd941b21c4616b7acf72e3899e0f1"
       ],
       "layout": "IPY_MODEL_1f73089f56244922af5127d0dabb6b7d"
      }
     },
     "e7ad18e2f2974a4894be759cf07ee391": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_a099f032e6b14c3099c4320eb4b8daff",
        "IPY_MODEL_a4562b7fc1164a7489ea3dc704e524e6"
       ],
       "layout": "IPY_MODEL_4d058972c61d401caa3a5b8c8fca82e0"
      }
     },
     "e93a3795bb424dbca63791d08119544a": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_f902e6d9c5d94f3987d86012e7f042ac",
       "max": 1,
       "style": "IPY_MODEL_05de525ceda84f4390c303b97f477323",
       "value": 1
      }
     },
     "e9a81e8b58654686995b5a03854ebd56": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_ea2a0821082a42d9bd7bd31e7f675ee7",
       "max": 1,
       "style": "IPY_MODEL_24693c12d9794be09d8c654489fca39c",
       "value": 1
      }
     },
     "ea2a0821082a42d9bd7bd31e7f675ee7": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "edd4df9fecc24c19ade14591e1fb9234": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_36da69c0c05949d69863899d76b5ab81",
       "max": 1,
       "style": "IPY_MODEL_11185b76e131467c86d7772356317f72",
       "value": 1
      }
     },
     "ef199f37c4e0495eb24c26c279d03289": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "ef2e37021b82442b9529ae5766fee15b": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "ef6f88f54d7e4ad3ac4c753805153efe": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_4a9c946913c442f1aea97537a1dba1e8",
       "max": 1,
       "style": "IPY_MODEL_57a2c6d6b0c543459d2da93c017f4216",
       "value": 1
      }
     },
     "efe3e9ea435743efac2e9e596dac7078": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_89dc0187eb624c63ba9c7694b039188e",
        "IPY_MODEL_d38b30728dd444e59e670b63d8214568"
       ],
       "layout": "IPY_MODEL_9ae7b7ad855e4952aeab88e9faf63b3c"
      }
     },
     "f1420e777cdf4f42aae667f7df9529dc": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "f15ab54207974eeaa3253dda4c2419bf": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_c1de7d491d9e42a285c1f45aca85970c",
       "style": "IPY_MODEL_3c9f6b9388f54ac49baf61c2fe7c3138",
       "value": " 100.00% elapsed time  :     6.73s =  0.1m =  0.0h cpu: 615%"
      }
     },
     "f3ebd941b21c4616b7acf72e3899e0f1": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_b0a90f6adb8d4443b495b30af7333781",
       "style": "IPY_MODEL_98e30ebf732f4de08e6781becea48b25",
       "value": " 100.00% elapsed time  :     0.73s =  0.0m =  0.0h cpu: 1098%"
      }
     },
     "f421ff08b7c64c7da1b7d7cba2c48ee4": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_c312343208d747368c973f87d37af284",
        "IPY_MODEL_434d56a120134e52ad6f6a437ef73d28"
       ],
       "layout": "IPY_MODEL_62f38fd28abc481595db3397148b62d8"
      }
     },
     "f4241116a621450fbfb226b554c3cb66": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "FloatProgressModel",
      "state": {
       "layout": "IPY_MODEL_dcbacc4290474b2eaebd00462b525600",
       "max": 1,
       "style": "IPY_MODEL_6bc0cf53518e416986f4329a1096a12d",
       "value": 1
      }
     },
     "f4f3e2a2e3de4f7299ab0a2c2ef87668": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "f5410bda66ec440292d57beb231ce411": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "f5bcb62dd88f4174a00c460074c752e1": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "f6e4add5240b48f196cbcc8112166a01": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "f72100e8217f4b718bdafde6561fe4d4": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "f7ec341be29345c3b5be7bcaf6847da4": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "f8cd216e54124845bdcff36a1671d9a5": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "f902e6d9c5d94f3987d86012e7f042ac": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "f92f8869ab2d488a96b069e9fa61618d": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "f97acbc63f1e4ee3b9de44c17bbcb985": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "f9cc140807d94fd3a7b075b6c0992113": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "fb592d86fa5b42f59cf0c46a38e848ae": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "ProgressStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "fba74923f4c74720aa9d0ce64ae1966e": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_9d0c9f4613b0488cb4d432b723eabbf0",
        "IPY_MODEL_7cc38c5db68146ab959c29a7ffa79611"
       ],
       "layout": "IPY_MODEL_ccebbe0638da4318814b332cb007d67f"
      }
     },
     "fc82d3e528d842cbba785f5af38d95bb": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_de5da09314ff49fcbffb829be4d54934",
       "style": "IPY_MODEL_55dfdf279579445b838ec0d33f7ea288",
       "value": " 100.00% elapsed time  :    32.20s =  0.5m =  0.0h cpu: 646%"
      }
     },
     "fd2d9deaf7a54197bc18d843a05d5b68": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_588c90725f48419785c1765c92fa5165",
        "IPY_MODEL_fc82d3e528d842cbba785f5af38d95bb"
       ],
       "layout": "IPY_MODEL_43dbecd38c584b35aeb431b6ce7a454a"
      }
     },
     "fdf40fdde1fa4c9a9cf46ce7add54e0e": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "fe5596a613524f14b907e22ff465a421": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_80dc3198d4374edab4bcc590fc5560b5",
       "style": "IPY_MODEL_2230558f090249c0816bbc27dbb41579",
       "value": " 100.00% elapsed time  :     0.69s =  0.0m =  0.0h cpu: 1125%"
      }
     },
     "fe7bc9203b2a4fa2939e53d680790427": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.5.0",
      "model_name": "DescriptionStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "fee2fab921c540878e5e0a77a8566f23": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "ff3fd3f23df944d28a2e4cd6ac313427": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.2.0",
      "model_name": "LayoutModel",
      "state": {}
     }
    },
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
